开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
一、背景
新公司入职,最新技术栈由Mybatis转到SpringDataJpa,学习记录总结回顾使用。
二、使用案例
版本号:3.0.1
2.1、官方文档链接
2.2、JpaRepository接口
2.2.1、接口结构图及简单说明
- 继承接口一:ListCrudRepository,主要包括save、find、delete相关操作。
- 继承接口二:ListPagingAndSortingRepository,主要包括分页、排序相关操作。
- 继承接口三:QueryByExampleExecutor,主要包括使用Example查询类的相关操作
2.3、方法拼接
官方规范
利用关键字及表内文章字段进行xxRepository接口中方法的定义,Jpa会对方法进行自动转义。
2.4、自定义query语句
@Query(value = "select * from user where name = ? and age = ?", nativeQuery = true)
User findNameAge(String name, Integer age);
注意,nativeQuery注解标明使用sql原生语句。
2.5、动态查询接口JpaSpecificationExecutor
// 以findOne来举例
Optional<Teacher> one = teacherRepository.findOne(((root, query, cb) -> {
// 构建查询条件List
List<Predicate> predicates = new ArrayList<>();
// 添加查询条件
predicates.add(cb.like(root.get("name"), "name" + "%"));
// 进行实际查询
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
}));
注意:自定义xxRepository接口需继承JpaRepository接口并定义好范性的类型,才可被Spring接管。
三、原理探索
通过断点预设debug分析,自定义xxRepository接口的代理类为SimpleJpaRepository,主要实现逻辑在SimpleJpaRepository的具体方法中。 逻辑具体执行时,主要是通过EntityManager进行具体的方法调用。
四、总结
1、两者的不同:MyBatis是半自动化框架,需要手动进行xml语句的编辑。Jpa是全自动框架,可以根据自定义方法名称进行sql转化。
2、Jpa是SpringData生态中的一部分,mybatis的定位是一个组件。
五、遗留问题
自定义xxRepository接口只有继承了JpaRepository接口才能自动注入到bean上下文中,有想法的各位可以具体评论回答下。