SpringBoot整合JPA(六)下

简介: SpringBoot整合JPA(六)

二.四.三 JPA测试


在test目录下,创建JpaRepositoryTests 进行测试。


二.四.三.一 查询全部


 @Test
    public void findAllTest(){
        List<User> userList=userService.jpaFindAll();
        userList.forEach(n->log.info(n));
    }


业务方法


@Autowired
    private UserJpaRepository userJpaRepository;
@Override
    public List<User> jpaFindAll() {
        return userJpaRepository.findAll();
    }


不用往 UserJpaRepository 添加方法。


7f98e4d75e8c1f1bd176e7ccdd1fc163.png


二.四.三.二 Example 查询 (通常不用)


测试方法


@Test
    public void findByExampleTest(){
        User user=new User();
        user.setName("泽霖");
        user.setAge(25);
        user.setSex("男");
        //1.创建匹配器
        ExampleMatcher exampleMatcher=ExampleMatcher.matching()
                .withMatcher("sex",matcher -> matcher.contains())
                .withMatcher("age",matcher -> matcher.exact())
                .withMatcher("name",matcher ->matcher.contains());
        //2. 生成Example 对象
        Example example=Example.of(user,exampleMatcher);
        //3. 进行查询
        List<User>userList=userService.findByExample(example);
        userList.forEach(n->log.info(n));
    }


业务实现接口


 @Override
    public List<User> findByExample(Example example) {
        return userJpaRepository.findAll(example);
    }


不用往 UserJpaRepository 添加方法。


36d3be8e711660ad2f5661fdc44caffe.png


二.四.三.三 根据名称进行查询


 @Test
    public void findByNameTest(){
       List<User> userList=userService.findByName("小欢欢");
        userList.forEach(n->log.info(n));
    }


业务方法


 @Override
    public List<User> findByName(String name) {
        return userJpaRepository.findByName(name);
    }


需要往 UserJpaRepository 里面添加方法,需要符合一定的规则


 List<User> findByName(String name);


13179a2e34595c2484695d58d27ca79c.png


二.四.三.四 根据性别和年龄


@Test
    public void findBySexAndAgeTest(){
        List<User> userList=userService.findBySexAndAge("男",25);
        userList.forEach(n->log.info(n));
    }


业务方法


@Override
    public List<User> findBySexAndAge(String sex, Integer age) {
        return userJpaRepository.findBySexAndAge(sex,age);
    }


需要往 UserJpaRepository 里面添加方法,需要符合一定的规则


List<User> findBySexAndAge(String sex, Integer age);


790f52d83867531b37354dda5fdfbec7.png


二.四.三.五 根据性别查询,年龄排序


 @Test
    public void findAllOrderByTest(){
        List<User> userList=userService.findBySexOrderByAge("女");
        userList.forEach(n->log.info(n));
    }


业务方法


  @Override
    public List<User> findBySexOrderByAge(String sex) {
        return userJpaRepository.findBySexOrderByAgeDesc(sex);
    }


需要往 UserJpaRepository 里面添加方法,需要符合一定的规则


List<User> findBySexOrderByAgeDesc(String sex);


df283c066fe33adebc8af9dc7fbaa573.png


二.四.三.六 使用原始SQL进行查询部分字段


 @Test
    public void findQueryNameTest(){
        List<Map<String,Object>> userMapList=userService.findQueryByName("小欢欢");
        for(Map<String,Object> map:userMapList){
            log.info("id是:{},name是{}",map.get("id"),map.get("name"));
        }
    }


业务方法


 @Override
    public  List<Map<String,Object>> findQueryByName(String name) {
        return userJpaRepository.findQueryByName(name);
    }


需要往 UserJpaRepository 里面添加方法,需要符合一定的规则


@Query(value="select id as id,name as name from user where name=:name",nativeQuery = true)
    List<Map<String,Object>> findQueryByName(@Param("name") String name);


be06ac0b987be6a17156b2c893f998b3.png


二.四.三.七 使用原始SQL进行查询全部字段


 @Test
    public void findQueryNameTest(){
        List<Map<String,Object>> userMapList=userService.findQueryByName("小欢欢");
        for(Map<String,Object> map:userMapList){
            log.info("id是:{},name是{}",map.get("id"),map.get("name"));
        }
    }


业务方法


 @Override
    public List<User> jpaFindAllSql(String name) {
        return userJpaRepository.findAllSql(name);
    }


需要往 UserJpaRepository 里面添加方法,需要符合一定的规则


  @Query(value="select * from user where name=:name",nativeQuery = true)
    List<User> findAllSql(@Param("name")String name);


e70a0241b1f34a0b97d698ca76749882.png


这就是 jpa的一些基本的用法。


二.五 JpaSpecificationExecutor 动态查询接口


二.五.一 接口的相关定义


public interface JpaSpecificationExecutor<T> {
}


image.png


二.五.二. JpaSpecificationExecutor实现


通常都是与 JpaRepository 一起使用的。


public interface UserSpecificationRepository extends JpaRepository<User, Integer>,
        JpaSpecificationExecutor<User>{
}


二.五.三 Specification 动态查询测试


 @Test
    public void nameAndSexAndDescTest(){
        User user=new User();
        user.setName("小欢欢1");
        user.setSex("女");
        user.setAge(27);
        user.setDescription("小坏蛋");
        List<User> userList=userService.findByNameSexAndDesc(user);
        userList.forEach(n->log.info(n));
    }


业务接口方法


@Override
    public List<User> findByNameSexAndDesc(User user) {
        //1. 根据条件创建 Specification 对象信息
        Specification<User> specification=new Specification<User>(){
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                //1. 用于接收封装的查询对象
                List<Predicate> predicateList = new ArrayList<>();
                if(user!=null){
                    //1.如果name 不为空的话,对name 进行精确匹配
                    if(!StringUtils.isEmpty(user.getName())){
                        Predicate namePredicate = criteriaBuilder.equal(root.get("name"), user.getName());
                        predicateList.add(namePredicate);
                    }
                    //2.如果sex 不为空的话,也是精确匹配
                    if(!StringUtils.isEmpty(user.getSex())){
                        Predicate sexPredicate=criteriaBuilder.equal(root.get("sex"),user.getSex());
                        predicateList.add(sexPredicate);
                    }
                    //3.如果age不为空的话,就是 < 匹配
                    if(!StringUtils.isEmpty(user.getAge())){
                        Predicate agePreDicate=criteriaBuilder.lt(root.get("age"),user.getAge());
                        predicateList.add(agePreDicate);
                    }
                    //4. 如果description 不为空的话,进行模糊匹配
                    if(!StringUtils.isEmpty(user.getDescription())){
                        Predicate descPredicate=criteriaBuilder.like(root.get("description"),"%"+user.getDescription()
                        +"%");
                        predicateList.add(descPredicate);
                    }
                }
                return criteriaBuilder.and(predicateList.toArray(
                        new Predicate[predicateList.size()]
                ));
            }
        };
    //传入条件,也可以传入分页信息。这儿就不举例分页了。
        return userSpecificationRepository.findAll(specification);
    }


如果将 user条件的属性全部去掉,是一种sql查询,sex去掉,又是一种sql查询,会根据属性的不同,动态的处理。


794d7507070c62bdafecb371a5f99c3f.png


动态查询,也可以传入分页和排序的相关信息。

这个非常重要,需要重点掌握一下。


本章节的代码放置在 github 上:


https://github.com/yuejianli/springboot/tree/develop/Jpa


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!


相关文章
|
8月前
|
Java Spring
Springboot+jpa如何设置启动项目表不存在就主动创建,字段没有就新增
Springboot+jpa如何设置启动项目表不存在就主动创建,字段没有就新增
568 0
|
8月前
|
Java
Springboot+JPA+Sqlite整合demo
Springboot+JPA+Sqlite整合demo
257 0
|
7月前
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
|
3月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
63 0
Springboot引入jpa来管理数据库
|
3月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
74 0
|
4月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
|
5月前
|
Java 关系型数据库 MySQL
|
5月前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
70 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
5月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
51 0
|
5月前
|
存储 Java 数据库