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


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


相关文章
|
1月前
|
存储 Java 测试技术
《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解
Spring 提供了一组测试工具,可以轻松地测试 Spring 应用程序的各个组件,包括控制器、服务、存储库和其他组件。它具有丰富的测试注释、实用程序类和其他功能,以帮助进行单元测试、集成测试等。
67 0
|
8月前
|
缓存 Java Go
解决Spring Data JPA查询存在缓存问题及解决方案
解决Spring Data JPA查询存在缓存问题及解决方案
422 0
|
1月前
|
XML Java 数据库连接
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)
55 0
|
7天前
|
SQL Java 数据库
Java一分钟之-Spring Data JPA:简化数据库访问
【6月更文挑战第10天】Spring Data JPA是Spring Data项目的一部分,简化了Java数据库访问。它基于JPA,提供Repository接口,使开发者能通过方法命名约定自动执行SQL,减少代码量。快速上手包括添加相关依赖,配置数据库连接,并定义实体与Repository接口。常见问题涉及主键生成策略、查询方法命名和事务管理。示例展示了分页查询的使用。掌握Spring Data JPA能提升开发效率和代码质量。
28 0
|
1月前
|
Java Spring
Spring Boot利用Spring Data JPA实现排序与分页查询实战(附源码,超详细)
Spring Boot利用Spring Data JPA实现排序与分页查询实战(附源码,超详细)
124 0
|
1月前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
1月前
|
Java 数据库 Spring
如何使用Spring Data JPA完成审计功能
如何使用Spring Data JPA完成审计功能
|
1月前
|
Java 数据库连接 API
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
46 0
|
1月前
|
Java 数据库 数据安全/隐私保护
使用Spring Boot和JPA实现多数据源的方法
使用Spring Boot和JPA实现多数据源的方法
94 0
|
1月前
|
前端开发 JavaScript Java
【Spring Boot+Vue.js+JPA+Mysql】实现前后端分离的名片系统(附源码 超详细必看 可作为大作业使用)
【Spring Boot+Vue.js+JPA+Mysql】实现前后端分离的名片系统(附源码 超详细必看 可作为大作业使用)
66 0