文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringData JPA增删改查操作方法实例分析

2023-07-02 19:02

关注

这篇文章主要讲解了“SpringData JPA增删改查操作方法实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringData JPA增删改查操作方法实例分析”吧!

1、服务层调用dao继承的接口中的方法

dao层继承的继承JpaRepository和JpaSpecificationExecutor这两个接口,JpaRepository<操作的实体类, 主键类型> 封装了基本的curd操作,JpaSpecificationExecutor<操作的实体类类型> 封装了复杂的查询(分页、排序等)。

2、使用jpql语句进行查询

可以引入jpql(JPA查询语言)语句进行查询(jpql语句类似于sql语句,只不过sql操作的是数据表和字段,jpql操作的是对象和属性,比如 from Resume where id=xxx)

详细介绍参考https://www.yiibai.com/jpa

dao层代码

public interface ResumeDao extends JpaRepository<Resume, Long>, JpaSpecificationExecutor<Resume> {    @Query("from Resume where id=?1") // 这个"1"代表的下面方法形参中引入参数的位置作为查询id    public Resume findByJpql(Long id); // 使用jpql语句根据id查询数据}

测试

   @Test    public void testJpql() {        Resume byJpql = resumeDao.findByJpql(1L);        System.out.println(byJpql);    }

3、可以引入原生的sql语句

dao层

public interface ResumeDao extends JpaRepository<Resume, Long>, JpaSpecificationExecutor<Resume> {         @Query(value = "select * from tb_resume where id=?1", nativeQuery = true)    public Resume findBySql(Long id); // 使用sql语句根据id查询数据}

测试

@Test    public void testSql() {        Resume byJpql = resumeDao.findByJpql(2L);        System.out.println(byJpql);    }

4、根据jpa规定的特殊命名方法完成查询

可以在接口中自定义方法,而且不必引入jpql或者sql语句,这种方式叫做方法命名规则,也就是说定义的接口方法名是按照一定规则形成的,那么框架就能根据我们的方法名推断出我们的意图

SpringData JPA增删改查操作方法实例分析

SpringData JPA增删改查操作方法实例分析

dao层

public interface ResumeDao extends JpaRepository<Resume, Long>, JpaSpecificationExecutor<Resume> {     public List<Resume> findByNameLike(String name);    public List<Resume> findByNameLikeAndAddress(String name, String address);}

测试

    @Test    public void testMethodName() {        List<Resume> list = resumeDao.findByNameLike("张%");        System.out.println(list);    }    @Test    public void testMethodName2() {        List<Resume> list = resumeDao.findByNameLikeAndAddress("张%", "北京");        System.out.println(list);    }

5、动态查询

service层传入Dao层的条件不确定,把service拿到的条件封装成一个对象传递给Dao层,这个对象就叫做Specification(对条件的一个封装)

Specification接口中的方法

* <p>
* Optional<T> findOne(@Nullable Specification<T> var1); // 根据条件查询单个对象
* <p>
* List<T> findAll(@Nullable Specification<T> var1); // 根据条件查询所有
* <p>
* Page<T> findAll(@Nullable Specification<T> var1, Pageable var2); // 根据条件进行查询,并且进行分页
* <p>
* List<T> findAll(@Nullable Specification<T> var1, Sort var2);  // 根据条件进行查询,并进行排序
* <p>
* long count(@Nullable Specification<T> var1);  // 根据条件统计
* <p>
* interface Specification<T>
* Predicate toPredicate(Root<T> var1, CriteriaQuery<?> var2, CriteriaBuilder var3); // 用来封装查询条件
* Root:根属性(查询所需要的任何属性都可以从根对象中获取)
* CriteriaQuery:自定义查询方式,用不上
* CriteriaBuilder:查询构造器,封装了很多的查询条件(like 和等值查询等)

动态查询单个对象

 @Test    public void testSpecification() {                Specification<Resume> specification = new Specification<Resume>() {            @Override            public Predicate toPredicate(Root<Resume> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {                // 获取到name属性                Path<Object> name = root.get("name");                // 使用CriteriaBuilder针对name属性构建条件(精准查询)                Predicate predicate = criteriaBuilder.equal(name, "张三");                return predicate;            }        };        Optional<Resume> optional = resumeDao.findOne(specification);        Resume resume = optional.get();        System.out.println(resume);    }

动态查询多个

@Test    public void testSpecificationMultiCon() {                Specification<Resume> specification = new Specification<Resume>() {            @Override            public Predicate toPredicate(Root<Resume> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {                // 获取到name属性                Path<Object> name = root.get("name");                Path<Object> address = root.get("address");                // 条件1:使用CriteriaBuilder针对name属性构建条件(精准查询)                Predicate predicate1 = criteriaBuilder.equal(name, "张三");                // 条件2:address以"北"开头(模糊匹配)                Predicate predicate2 = criteriaBuilder.like(address.as(String.class), "北%"); // as作用将其转换为Expression,并且指定参数类型                // 组合两个条件                Predicate predicate = criteriaBuilder.and(predicate1, predicate2);                return predicate;            }        };        Optional<Resume> optional = resumeDao.findOne(specification);        Resume resume = optional.get();        System.out.println(resume);    }

排序

@Test    public void testSort() {        Sort sort = new Sort(Sort.Direction.DESC, "id"); // 根据id进行倒序        List<Resume> list = resumeDao.findAll(sort);        for (int i = 0; i < list.size(); i++) {            Resume resume = list.get(i);            System.out.println(resume);        }    }

分页

@Test    public void testPage() {                Pageable pageable = PageRequest.of(0, 2);        Page<Resume> all = resumeDao.findAll(pageable);        System.out.println(all);    }

感谢各位的阅读,以上就是“SpringData JPA增删改查操作方法实例分析”的内容了,经过本文的学习后,相信大家对SpringData JPA增删改查操作方法实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯