大家好,我是成都分院12期学员晋良金,今天为大家介绍在springboot中使用spring-data-jpa。
1.背景介绍
SpringData : Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。而SpringData 项目所支持的关系数据存储技术有两种:JDBC和JPA。Spring-data-jpa致力于减少数据访问层 (DAO) 的开发量, 开发者唯一要做的就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成。
2.知识剖析
开发步骤
(1)声明持久层的接口。继承Repository或其子接口即可;
(2)在接口中声明需要的业务方法。Spring Data 将根据给定的策略生成实现代码;
(3)在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象,即配置 <jpa:repositories>。(Springboot省略此步)
Spring-data-jpa提供的接口
(1)Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别;
(2)CrudRepository :是Repository的子接口,提供CRUD的功能;
(3)PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能;
(4)JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等;
(5)JpaSpecificationExecutor:用来做负责查询的接口;
(6)Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
——将表按一定规则输入到Excel文件之中;
——通过代码读取Excel文件中的内容;
代码
@Test public void findAll(){ /* List<String> list = new ArrayList(); list.add("updateAt"); list.add("nickName")*/ Sort sort = new Sort(Sort.Direction.ASC, "id"); Pageable pageable = PageRequest.of(1, 3, sort); Page<User> userPage = userRepository.findAll(new Specification<User>() { List<Predicate> predicates = new ArrayList<>(); @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { Predicate likeNickName = criteriaBuilder.like(root.get("nickName").as(String.class),"%"+"3"+"%"); predicates.add(likeNickName); return criteriaBuilder.and(predicates.toArray(new Predicate[0])); } }, pageable); System.out.println("总页数:" + userPage.getTotalPages()); System.out.println("每页大小:" + userPage.getSize()); System.out.println("数据:" + userPage.getContent()); System.out.println("页数:" + userPage.getNumber()); System.out.println("总数:" + userPage.getTotalElements()); }
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
(1)jpa与JDBC有什么不同
jpa只需要声明持久层接口就可以直接使用,不像JDBC需要写sql。
(2)jpa有什么劣势
对于动态查询支持得不太好,不像MyBatis可以直接在mapper文件中写简单的判断语句即可。
(3)jpa有什么优势
简单的增删改查会非常方便,不用写太多的代码。