当前位置: 首页 > news >正文

springboot入门-repository数据访问层JPA和mybatis

在 Spring Boot 中,Repository 接口是数据访问层(DAO)的核心抽象,而 JpaRepository 和 MyBatis 的实现方式有显著不同。以下是详细解释:


1. JPA 的 Repository 接口为什么使用 interface

(1) 基于接口的动态代理机制
  • 核心原理
    Spring Data JPA 使用 动态代理 在运行时自动生成接口的实现类。开发者只需定义接口,框架会根据方法名或 @Query 注解自动实现 SQL 逻辑。
  • 示例
    定义接口 UserRepository 继承 JpaRepository,无需编写实现代码:
    public interface UserRepository extends JpaRepository<User, Long> {// 自动根据方法名生成查询:SELECT * FROM user WHERE email = ?User findByEmail(String email);
    }
    
    Spring 会在运行时生成一个代理类,实现 findByEmail 方法,自动执行对应的 SQL 查询。
(2) 方法名派生查询(Query Derivation)
  • 规则
    通过方法名约定(如 findBycountBy)自动生成查询逻辑。例如:
    List<User> findByNameAndAgeGreaterThan(String name, int age);
    
    会自动生成 SQL:
    SELECT * FROM user WHERE name = ? AND age > ?;
    
(3) 优势
  • 减少样板代码:无需手动编写 CRUD 方法。
  • 类型安全:基于实体类和字段名,避免 SQL 字符串拼写错误。
  • 快速开发:适合简单查询场景,提高开发效率。
(4) 接口设计的意义
  • 约定优于配置:通过接口定义规范,框架处理底层实现。
  • 解耦:业务层只依赖接口,不关心具体数据源(如 MySQL、PostgreSQL)。

2. MyBatis 如何实现数据访问层?

(1) MyBatis 的核心概念
  • Mapper 接口:定义数据操作方法(类似 JPA 的 Repository 接口)。
  • XML 映射文件或注解:显式编写 SQL 语句,绑定到 Mapper 接口方法。
(2) 实现步骤
a. 定义 Mapper 接口
public interface UserMapper {// 通过注解直接编写 SQL@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);// 通过 XML 映射文件编写 SQLList<User> findByName(String name);
}
b. 编写 XML 映射文件(如 UserMapper.xml
<mapper namespace="com.example.mapper.UserMapper"><select id="findByName" resultType="User">SELECT * FROM user WHERE name = #{name}</select>
</mapper>
c. 配置 MyBatis

application.yml 中指定 XML 文件路径:

mybatis:mapper-locations: classpath:mapper/*.xml
(3) 动态 SQL 支持

MyBatis 提供 <if>, <foreach> 等标签处理复杂 SQL:

<select id="findByCondition" resultType="User">SELECT * FROM user<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
(4) 优势
  • 灵活控制 SQL:直接编写 SQL,适合复杂查询和优化。
  • 与数据库特性深度结合:可自由使用数据库专有语法(如 Oracle 的 CONNECT BY)。
  • 易于调试:SQL 显式定义,便于日志分析和性能优化。

3. JPA 和 MyBatis 的对比

特性Spring Data JPAMyBatis
抽象层级高(面向对象,无需直接写 SQL)低(需显式编写 SQL)
开发效率高(自动生成 CRUD)中(需手动编写 SQL)
灵活性低(复杂 SQL 需自定义)高(完全控制 SQL)
适用场景简单 CRUD、快速开发复杂查询、遗留数据库、需深度优化 SQL
学习成本低(方法名约定)中(需学习 XML/注解配置)
维护性高(字段变更自动同步)中(需手动同步 SQL 和实体类)

4. 代码示例对比

(1) JPA 实现查询用户
// Repository 接口
public interface UserRepository extends JpaRepository<User, Long> {User findByEmail(String email);
}// Service 直接调用
User user = userRepository.findByEmail("test@example.com");
(2) MyBatis 实现查询用户
// Mapper 接口
public interface UserMapper {@Select("SELECT * FROM user WHERE email = #{email}")User findByEmail(String email);
}// Service 注入 Mapper
@Autowired
private UserMapper userMapper;User user = userMapper.findByEmail("test@example.com");

5. 如何选择?

  • 选 JPA
    项目以简单 CRUD 为主,希望快速开发,避免手动编写 SQL。
  • 选 MyBatis
    项目涉及复杂 SQL、存储过程调用,或需要深度优化数据库性能。

总结

  • JPA 的 Repository 接口
    通过动态代理和约定自动生成实现,减少代码量,适合标准化操作。
  • MyBatis 的 Mapper 接口
    需显式定义 SQL(XML 或注解),灵活性高,适合复杂场景。
  • 核心区别
    JPA 是 ORM 框架,MyBatis 是 SQL 映射框架,前者抽象层次更高,后者控制力更强。
http://www.xdnf.cn/news/160147.html

相关文章:

  • 代理专栏总结
  • 架构师备考-设计模式23种及其记忆特点
  • 栈应用:括号匹配
  • arduino显示数码管1~9
  • 除自身以外的乘积 --- 前缀和
  • UNO Less-to-More Generalization: 通过上下文生成解锁更多可控性
  • 代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)
  • 深度学习-学习笔记
  • 网络原理 - 9
  • 硬件须知的基本问题2
  • Network.framework 的引入,不是为了取代 URLSession
  • 【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码)
  • 静态多态和动态多态的区别
  • 大规模SoC芯片Hierarchical Flow Calibre LVS教程
  • 20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件
  • CSS 定位学习笔记
  • springboot入门-业务逻辑核心service层
  • 上海交大:推理驱动的多模态提示重写
  • 20250426在ubuntu20.04.2系统上解决问题mkfs.exfat command not found
  • OpenStack Yoga版安装笔记(24)启动一个实例(L2Population测试)
  • 线程池(五):线程池使用场景问题
  • ROC 曲线 和 AUC
  • C/C++ 头文件包含机制:从语法到最佳实践
  • 利用知识图谱提升测试用例生成精准性:基于Graphiti与DeepSeek-R1的实战指南
  • git 工具
  • 神经网络与深度学习第四章-前馈神经网络
  • 在分类任务中,显著性分析
  • C++ 同步原语
  • 关于动态规划的思考[特殊字符]
  • [特殊字符] 深入理解Spring Cloud与微服务架构:全流程详解(含中间件分类与实战经验)