一、核心概念
-
MyBatis
-
定義:基于 SQL 的持久層框架,提供靈活的 SQL 映射和自定義查詢能力。
-
特點:
-
開發者手動編寫 SQL(XML 或注解)。
-
支持動態 SQL、復雜查詢優化。
-
輕量級,對數據庫控制力強。
-
-
-
Spring Data JPA
-
定義:基于 JPA(Java Persistence API)規范的 ORM 框架,提供 Repository 抽象。
-
特點:
-
通過接口自動生成 CRUD 方法(如?
save()
,?findAll()
)。 -
支持方法名衍生查詢(如?
findByUsername(String name)
)。 -
依賴 Hibernate 實現,適合快速開發。
-
-
二、優缺點對比
特性 | MyBatis | Spring Data JPA |
---|---|---|
SQL 控制 | 完全手動編寫,靈活性高 | 自動生成,靈活性低 |
開發效率 | 需寫 SQL 和映射文件,效率較低 | 自動生成代碼,開發效率高 |
學習成本 | 需熟悉 SQL 和 XML 配置 | 需理解 JPA 規范和衍生查詢語法 |
復雜查詢支持 | 強(支持動態 SQL) | 弱(需結合?@Query ?或 QueryDSL 擴展) |
數據庫兼容性 | 依賴 SQL 方言 | 通過 Hibernate 適配多種數據庫 |
三、框架結構對比
1. MyBatis 的典型分層結構
src/ ├── main/ │ ├── java/ │ │ ├── entity/ # 實體類(與數據庫表映射) │ │ ├── mapper/ # Mapper 接口(定義 SQL 操作) │ │ ├── service/ # 業務邏輯層 │ │ └── controller/ # 控制層(處理 HTTP 請求) │ └── resources/ │ └── mapper/ # SQL 映射文件(XML)
2. Spring Data JPA 的典型分層結構
src/ ├── main/ │ ├── java/ │ │ ├── entity/ # 實體類(帶 JPA 注解) │ │ ├── repository/ # Repository 接口(繼承 JpaRepository) │ │ ├── service/ # 業務邏輯層 │ │ └── controller/ # 控制層 │ └── resources/ │ └── application.yml # 配置 JPA 和數據庫連接
四、代碼示例對比
1. MyBatis 實現查詢
// Mapper 接口 public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id); }// Service 層 @Service public class UserService {@Autowiredprivate UserMapper userMapper;public User getUser(Long id) {return userMapper.findById(id);} }
2. Spring Data JPA 實現查詢
// Repository 接口 public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username); // 自動生成查詢 }// Service 層 @Service public class UserService {@Autowiredprivate UserRepository userRepository;public User getUser(String username) {return userRepository.findByUsername(username);} }
五、選擇建議
-
選 MyBatis:
-
需要復雜 SQL 或深度優化查詢性能。
-
遺留數據庫表結構復雜,難以通過 ORM 映射。
-
-
選 Spring Data JPA:
-
快速開發 CRUD 功能,減少樣板代碼。
-
項目采用領域驅動設計(DDD)。
-
六、架構圖對比(文字描述)
MyBatis 架構: [Controller] → [Service] → [Mapper Interface] ? [XML SQL] → [Database]Spring Data JPA 架構: [Controller] → [Service] → [Repository Interface] → [JPA/Hibernate] → [Database]
通過對比可以看出,MyBatis 的 SQL 控制更底層,而 JPA 通過抽象層隱藏了 SQL 細節。