zoukankan      html  css  js  c++  java
  • SpringDataJPA

    SpringDataJPA接口继承结构和底层原理、JPARepository接口使用和其它接口的使用

    学习主题:SpringDataJPA

    一、Spring Data JPA接口继承结构

    1. Spring Data JPA的继承结构。

    Repository接口规范(总接口)
    CRUDRepository接口(继承Repository接口)
    PagingAndSorting接口(继承CRUDRepository接口)
    JPARepository接口(继承PagingAndSorting接口)
    JPASpecificationExecutor接口

    二、SpringDataJPA底层原理

    1. 阐述Spring Data JPA的底层运行原理。

    底层依赖HibernateJPA,通过在xml配置EntityManager

    三、Repository接口

    (1)方法命名规则查询

    1. Repository接口的作用是什么?

    Repository 接口是 SpringDataJPA 中为我们提供的所有接口中的顶层接口
    实现数据的查询

    2. Repository接口支持几种查询方式?

    接口-方法命名规则查询
    @Query注解查询

    3. 什么是方法命名规则查询?

    使用findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)规则查询
    public interface UsersDao extends Repository<Users, Integer> {
        //方法名称命名规则
        List<Users> findByUsername(String string);
    
        List<Users> findByUsernameLike(String string);
    
    List<Users> findByUsernameAndUserageGreaterThan(String string, Integer age);
    }

     

    (2)@Query查询JPQL语句

    1. @Query注解的作用是什么?

    通过 Hibernate 的 HQL 演变过来的。他和 HQL 语法及其相似
    实现对数据的基本查询

    2. 使用JPQL查询方式t_users表,条件为用户名相等。

    @Query(value = "from Users where username = ?")
    List<Users> queryUsersByUsernameUseJPQL(String name);

    3. 使用JPQL查询方式t_users表,条件为用户名Like。

    @Query(value = "from Users where username like ?")
    List<Users> queryUsersByUsernameLikeUseJPQL(String name);

    4. 使用JPQL查询方式t_users表,条件为用户名年龄大于。

    @Query(value = "from Users where username = ? and userage >= ?")
    List<Users> queryUsersByUsernameAndUserageUseJPQL(String name, Integer age);

    5.使用JPQL更新方式t_users表,条件为用户名和年龄

    @Query("update Users set userage = ? where userid = ?")
    @Modifying
    void updateAgeById(Integer age,Integer id);

     

    (3)@Query查询SQL语句

    1. 使用SQL查询方式t_users表,条件为用户名相等。

    @Query(value = "select * from t_users where username = ?", nativeQuery = true)
     List<Users> queryUsersByNameUseSQL(String name);

    2. 使用SQL查询方式t_users表,条件为用户名Like。

    @Query(value = "select * from t_users where username like ?", nativeQuery = true)
    List<Users> queryUsersByNameLikeUseSQL(String name);

    3. 使用SQL查询方式t_users表,条件为用户名年龄大于。

    @Query(value = "select * from t_users where username = ? and userage >= ?", nativeQuery = true)
        List<Users> queryUsersByNameAndAgeUseSQL(String name, Integer age);

    (4)@Query更新

    @Modifying注解的作用是什么?

    使用JPQL更新用户表

    四、CrudRepository接口的使用

    CrudRepository接口的作用是什么?

    实现对数据的增删改查操作

    五、PagingAndSortingRepository接口的使用

    (1)分页处理

    PagingAndSortingRepository接口的作用是什么?

    实现对数据的查询、分页和排序处理

    通过PagingAndSortingRepository接口完成带分页的查询。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class PagingAndSortingRepositoryTest {
    
        @Autowired
        private UserDao3 userDao3;
        /**
         * 分页
         */
        @Test
        public void test1(){
            int page = 0 ;
            int size = 2 ;
            Pageable pageRequest = new PageRequest(page,size);
            Page<Users> all = this.userDao3.findAll(pageRequest);
            System.out.println("数据总条数"+all.getTotalElements());
            System.out.println("数据总页数"+all.getTotalPages());
            List<Users> content = all.getContent();
            for (Users user:content) {
                System.out.println("当前页数的数据"+user);
            }
       }
    }

     

    (2)排序处理

    Sort对象的作用是什么?

    实现对Order排序条件的添加

    Order对象的作用是什么?

    封装排序条件

    Direction参数的作用是什么?

    设置排序类型,如Direction.DESC是倒序排序

    Properties参数的作用是什么?

    要排序的列

    六、JpaRepository接口的使用

    JpaRepository接口的作用是什么?

    实现上面接口的方法,主要是实现对返回数据结果的封装从Iteretor到list

    (1)JpaSpecificationExecutor接口-单条件查询

    JpaSpecificationExecutor接口的作用是什么?

    实现对非主键查询和多条件的查询以及分页和排序。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class JpaSpecificationExecutorTest {
    
        @Autowired
        private UserDao5 userDao5;
    
        /**
         * 单条件查询
         */
        @Test
        public void test1() {
            Specification<Users> spe = new Specification<Users>() {
                /**
                 *
                 * @param root:根对象。封装了查询条件的对象
                 * @param criteriaQuery :定义了一个基本查询。
                 * @param criteriaBuilder :创建一个查询条件
                 * @return predicate:定义查询条件
                 */
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    Predicate predicate = criteriaBuilder.equal(root.get("username"), "王娟");
                    return predicate;
                }
            };
            List<Users> list = this.userDao5.findAll(spe);
            for (Users users : list
            ) {
                System.out.println(users);
            }
       }
    }

     

    (2)多条件查询方式一

    通过JpaSpecificationExecutor接口对t_users表完成多条件的查询。

    /**
         * 多条件查询方式一
         */
    @Test
        public void test2() {
            Specification<Users> spe = new Specification<Users>() {
                @Override
                public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> list = new ArrayList<>();
                    list.add(criteriaBuilder.equal(root.get("username"), "丁美丽"));
                    list.add(criteriaBuilder.equal(root.get("userage"), 19));
                    Predicate[] pre = new Predicate[list.size()];
                    return criteriaBuilder.and(list.toArray(pre));
                }
            };
            List<Users> list = this.userDao5.findAll(spe);
            for (Users users : list
            ) {
                System.out.println(users);
            }
    
        }

     

    (3)多条件查询方式二

    通过JpaSpecificationExecutor接口对t_users表完成多条件的查询。

    /**
         * 多条件查询方式二
         */
        @Test
        public void test3() {
            Specification<Users> spe = new Specification<Users>() {
                @Override
                public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    Predicate equal1 = criteriaBuilder.equal(root.get("username"), "杜程程");
                    Predicate equal2 = criteriaBuilder.equal(root.get("userage"), 19);
                    return criteriaBuilder.or(equal1, equal2);
                }
            };
            List<Users> list = this.userDao5.findAll(spe);
            for (Users users : list
            ) {
                System.out.println(users);
            }
        }

     

    (4)多条件查询-分页处理

    通过JpaSpecificationExecutor接口完成对查询结果集的分页处理。

    /**
         * 对查询结果分页
         */
        @Test
        public void test4() {
            Specification<Users> specification = new Specification<Users>() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    return criteriaBuilder.like(root.get("username"), "李%");
                }
            };
            Pageable pagaable = new PageRequest(0, 3);
            Page<Users> page = this.userDao5.findAll(specification, pagaable);
            System.out.println("总条数" + page.getTotalElements());
            System.out.println("总页数" + page.getTotalPages());
            List<Users> content = page.getContent();
            for (Users user : content) {
                System.out.println(user);
            }
        }

     

    (5)多条件查询-排序处理

    通过JpaSpecificationExecutor接口完成对查询结果集的排序处理。

    /**
         * 查询+排序
         */
        @Test
        public void test5() {
            Specification<Users> specification = new Specification<Users>() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    return criteriaBuilder.like(root.get("username"), "李%");
                }
            };
            //Pageable pagaable = new PageRequest(0, 3);
            Sort sort = new Sort(Sort.Direction.DESC, "userid");
            List<Users> list = this.userDao5.findAll(specification, sort);
            for (Users user : list) {
                System.out.println(user);
            }
        }

     

    (6)多条件查询+分页+排序

    通过JpaSpecificationExecutor接口完成对查询结果集的分页与排序处理。

    /**
         * 查询+分页+排序
         */
        @Test
        public void test6() {
            Specification<Users> specification = new Specification<Users>() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    return criteriaBuilder.like(root.get("username"), "李%");
                }
            };
            Sort sort  = new Sort(Sort.Direction.DESC,"userid");
            Pageable pagaable = new PageRequest(1, 2,sort);
            Page<Users> page = this.userDao5.findAll(specification, pagaable);
            System.out.println("总条数" + page.getTotalElements());
            System.out.println("总页数" + page.getTotalPages());
            List<Users> content = page.getContent();
            for (Users user : content) {
                System.out.println(user);
            }
        }
    文章出处:https://zhuanlan.zhihu.com/p/91687738
  • 相关阅读:
    第一章
    第一章 计算机系统漫游
    hihocoder #1014 : Trie树
    第一章
    来个小目标
    poj 1056 IMMEDIATE DECODABILITY
    poj 2001 Shortest Prefixes
    __name__ 指示模块应如何被加载
    Python 常用函数time.strftime()简介
    CentOS安装beEF做XSS平台
  • 原文地址:https://www.cnblogs.com/hejj-bk/p/14636860.html
Copyright © 2011-2022 走看看