首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC 數據訪問架構:從 Controller 到 Database 的完整鏈路

     編輯:程式設計綜合問答

Spring MVC 本身**不直接連接數據庫**,它是 Web 層框架,數據訪問由 **Spring Data / MyBatis / JdbcTemplate** 等組件完成,通過依賴注入串聯。

分層架構圖解

┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Controller │────▶│  Service    │────▶│ Repository  │────▶│  Database   │
│  (入參/出參) │     │  (事務/業務) │     │  (SQL/ORM)  │     │  (MySQL)    │
└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘
       │                   │                   │                   │
   @RequestMapping    @Transactional      @Repository          DataSource
   @RequestBody       @Service            @Mapper              HikariCP
   ResponseEntity

主流數據訪問技術對比

技術定位優點缺點
Spring Data JPAORM 標準接口式開發、自動生成 CRUD、頁面/排序內建複雜查詢需 JPQL/Specification、學習曲線陡
MyBatis / MyBatis-Plus半自動 ORMSQL 完全可控、動態 SQL 強、映射靈活樣板代碼多、需手寫 XML/註解
JdbcTemplate輕量封裝無映射開銷、適合簡單查詢/批量操作手動 RowMapper、無實體管理
QueryDSL / jOOQ類型安全 SQL編譯期檢查 SQL、重構友好引入代碼生成步驟、團隊接受度較低

Spring Data JPA + MySQL 快速集成

1. 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
</dependency>

2. 配置

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

3. 實體與倉庫

@Entity @Table(name = "users")
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;
    // getter/setter
}

public interface UserRepository extends JpaRepository {
    Optional findByUsername(String username);
    @Query("SELECT u FROM User u WHERE u.email LIKE %:domain%")
    List findByEmailDomain(@Param("domain") String domain);
}

4. 服務層事務

@Service @Transactional
public class UserService {
    @Autowired UserRepository repo;
    
    public User register(String username, String email) {
        if (repo.findByUsername(username).isPresent()) 
            throw new BusinessException("用戶名已存在");
        User u = new User(); u.setUsername(username); u.setEmail(email);
        return repo.save(u);
    }
}

5. 控制器

@RestController @RequestMapping("/api/users")
public class UserController {
    @Autowired UserService service;
    
    @PostMapping
    public ResponseEntity register(@RequestBody RegisterDTO dto) {
        User u = service.register(dto.getUsername(), dto.getEmail());
        return ResponseEntity.status(HttpStatus.CREATED).body(u);
    }
}

核心原理:DataSource → SessionFactory → EntityManager → Repository

Spring Boot 自動配置鏈:`DataSourceAutoConfiguration` → `HibernateJpaAutoConfiguration` → 創建 `LocalContainerEntityManagerFactoryBean` → 掃描 `@Entity` → 為 `JpaRepository` 生成代理實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved