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 JPA | ORM 標準 | 接口式開發、自動生成 CRUD、頁面/排序內建 | 複雜查詢需 JPQL/Specification、學習曲線陡 |
| MyBatis / MyBatis-Plus | 半自動 ORM | SQL 完全可控、動態 SQL 強、映射靈活 | 樣板代碼多、需手寫 XML/註解 |
| JdbcTemplate | 輕量封裝 | 無映射開銷、適合簡單查詢/批量操作 | 手動 RowMapper、無實體管理 |
| QueryDSL / jOOQ | 類型安全 SQL | 編譯期檢查 SQL、重構友好 | 引入代碼生成步驟、團隊接受度較低 |
<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>
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
@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);
}
@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);
}
}
@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);
}
}
Spring Boot 自動配置鏈:`DataSourceAutoConfiguration` → `HibernateJpaAutoConfiguration` → 創建 `LocalContainerEntityManagerFactoryBean` → 掃描 `@Entity` → 為 `JpaRepository` 生成代理實現。