一、核心概念
-  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 细节。