SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用
SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用
上一篇介绍了Mybatis的配置和基本用法《SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库CRUD》
这一篇在此基础上进阶使用Spring-data-jpa。
所以,这里就不说怎么怎么配置了,直接写Spring-data-jpa的写法,至于调用,dao层的自己用service调就可以了,需要service配合的会写出来部分逻辑。
Git地址:
Gitee
项目地址:
品茗IT-同步发布
品茗IT 提供在线支持:
一键快速构建Spring项目工具
一键快速构建SpringBoot项目工具
一键快速构建SpringCloud项目工具
一站式Springboot项目生成
Mysql一键生成Mybatis注解Mapper
如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。
一、普通写法
Spring-data-jpa支持继承接口中的所有方法直接调用,同时也支持以下几种简便使用方法:
- find…By,read…By,query…By,count…By,和get…By: 这些写法具体使用需要到官方网站上查询,东西太多了。这里只写出findBy的部分用法。
findBy的Spring-data-jpa官方示例:
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1(parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1(parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1(parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection ages) | … where x.age not in ?1 |
TRUE | findByActiveTrue() | … where x.active = true |
FALSE | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
- deleteBy:删除,后面跟字段即可。
二、JPQL和原生SQL
JPQL写法:
public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from User u where u.emailAddress = ?1")User findByEmailAddress(String emailAddress);@Query("select u from User u where u.firstname like %?1")List<User> findByFirstnameEndsWith(String firstname);@Modifying@Query("update User u set u.firstname = ?1 where u.lastname = ?2")int setFixedFirstnameFor(String firstname, String lastname);@Modifying@Query("delete from User u where user.role.id = ?1")void deleteInBulkByRoleId(long roleId);
}
原生SQL写法:
无它,就是SQL语句。需要注意的是,返回的实体要是表对应实体。
public interface UserRepository extends JpaRepository<User, Long> {@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)User findByEmailAddress(String emailAddress);}
三、排序
可以使用Sort传参。
public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from User u where u.lastname like ?1%")List<User> findByAndSort(String lastname, Sort sort);}
也可以通过方法名称来进行排序。
public interface UserRepository extends JpaRepository<User, Long> {@Query("select u from User u where u.lastname like ?1%")List<User> findByAndSort(String lastname, Sort sort);List<User> findByLastnameOrderByFirstnameAsc(String lastname);List<User> findByLastnameOrderByFirstnameDesc(String lastname);
}
四、分页
通过传递Pageable参数进行分页,切记,分页页码是从0开始的。
Pageable也可以进行排序。
public interface UserRepository extends JpaRepository<User, Long> {Page<User> findByLastname(String lastname, Pageable pageable);}
五、动态SQL
Spring-data-jpa已经很方便了,但是有时候我们有的参数为空,这时我们不想让这些参数作为条件查询,笨办法就是去写n个方法,当然也有好办法了,那就是JpaSpecificationExecutor:
@Repository
public interface RdTaskDao extends JpaRepository<RdTask, Integer>, JpaSpecificationExecutor<RdTask> {}
使用以下sql组装Specification,然后调用findAll进行查询。
Specification<RdTask> querySpecifi = new Specification<RdTask>() {private static final long serialVersionUID = 1L;@Overridepublic Predicate toPredicate(Root<RdTask> root, CriteriaQuery<?> criteriaQuery,CriteriaBuilder criteriaBuilder) {List<Predicate> predicates = new ArrayList<>();//未删除标识predicates.add(criteriaBuilder.equal(root.get("deleteFlag"), 0));if (!StringUtils.isEmpty(rdTaskListReq.getCreator())) {predicates.add(criteriaBuilder.equal(root.get("creator"), rdTaskListReq.getCreator()));}if (!StringUtils.isEmpty(rdTaskListReq.getDesignater())) {predicates.add(criteriaBuilder.equal(root.get("designater"), rdTaskListReq.getDesignater()));}if (null != rdTaskListReq.getType()) {predicates.add(criteriaBuilder.equal(root.get("type"), rdTaskListReq.getType()));}if (null != rdTaskListReq.getStatus()) {if (rdTaskListReq.getStatus().equals("doing")) {predicates.add(criteriaBuilder.equal(root.get("status"), "doing"));} else if (rdTaskListReq.getStatus().equals("closed")) {predicates.add(criteriaBuilder.equal(root.get("status"), "closed"));}}return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));}};Pageable pageable = PageRequest.of(rdTaskListReq.getPage(), rdTaskListReq.getPageSize(), Direction.DESC, "createTime");Page<RdTask> page = rdTaskDao.findAll(querySpecifi, pageable);
详细完整代码,可以访问品茗IT-博客《SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用》,也可以在Spring组件化构建中选择查看,并下载。
六、 事务
@Transactional注解开启事务。可以注解在类上,也可以注解在方法上。Spring对更新删除操作强制要求加上@Transactional注解。
@Transactional使用没多少注意的事情,除非是要求特别严格的系统,那就别看乱七八糟的博客,去看官方文档,博客只能带你入门,知道有哪些东西。
@Transactional一般配置下异常的捕获rollbackFor属性,默认情况下只捕获RuntimeException,可以将注解在方法上的@Transactional改为:
@Transactional(rollbackFor=Exception.class)
这样就会捕获所有异常。
mysql的MyISAM引擎不支持事务,切记。
快速构建项目
Spring组件化构建
喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot技术吧!
SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用相关推荐
- SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用
SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一.概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能 ...
- SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室
SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室 一.概述 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 ...
- SpringBoot入门建站全系列(二十八)整合Kafka做日志监控
SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...
- SpringBoot入门建站全系列(九)文件上传功能与下载方式
SpringBoot入门建站全系列(九)文件上传功能与下载方式 Spring对文件上传做了简单的封装,就是用MultipartFile这个对象去接收文件,当然有很多种写法,下面会一一介绍. 文件的下载 ...
- spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作
SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作 一.概述 多数据源,就是有多个数据库的配置. 多数据源配置并不麻烦,使用起来和单数据源基本相同,但是,重要的是事务的控制 ...
- boot spring test 文档_SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库
SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库 SpringBoot操作数据库有多种方式,如 JDBC直接操作:太古老了,没人愿意这样玩 Mybatis插件:比较 ...
- spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...
SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件 一.概述 Spring Boot允许多种配置来源,官网是这样说的: Spring Boot使用一种非常特殊的Property ...
- springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存
SpringBoot入门建站全系列(十四)集成Redis缓存 一.概述 本地缓存,就是使用应用内使用本地内存将数据暂缓存储,一般数据库的查询如果不怎么改动,可以用本地缓存暂存. 远程缓存,比如redi ...
- springboot util 测试类怎么写_SpringBoot入门建站全系列(九)文件上传功能与下载方式...
SpringBoot入门建站全系列(九)文件上传功能与下载方式 Spring对文件上传做了简单的封装,就是用MultipartFile这个对象去接收文件,当然有很多种写法,下面会一一介绍. 文件的下载 ...
最新文章
- Spring学习总结(7)——applicationContext.xml 配置文详解
- 深度 | 一文读懂“情感计算”在零售中的应用发展
- 因买不到 RTX 3090,他花 19 万搭了一个专业级机器学习工作站
- LoadRunner 测试Tuxedo的问题
- [转]我们为什么需要工作流
- Linux常用Shell脚本珍藏
- mysql 基础视图_MySQL基础(4) | 视图
- python中字典的输出序列_python3:序列_字典(常用基础知识)
- 2021年度抖音小红书美妆行业营销报告
- 手机访问 电脑的html文件,手机能访问电脑的共享文件吗 如何用手机看电脑文件...
- curl post json_curl 模拟 GETPOST 请求,以及 curl post 上传文件
- 深度学习多种模型评估指标介绍 - 附sklearn实现
- Matlab2017a(64位)安装包下载及详细安装步骤
- vue 前端打印pdf
- Inception 模块作用
- 阿里云Web应用防火墙价格表
- npm i 命令安装失败提示:npm WARN read-shrinkwrap,解决方法
- IDEA括起选中的选中的内容
- 函数:fopen的使用方法
- JS setTimeout延迟时间为0的详解
热门文章
- JavaScript强制类型转换(二)Number数值型
- 说命理(五)—— 麻衣相面
- x86/x64/x86_64/i386/ia32/ia64/amd/amd64 辨析
- 克罗格 Kroger EDI需求分析及注意事项
- springboot项目优雅的停止服务
- python tkinter游戏界面_python tkinter游戏开发
- 管理不确定性,华为是如何做到的?
- (基础)JavaScript截取数组:使用splice()和slice()方法
- 通过class控制div的显示隐藏
- 扩频时钟SSC技术,即展频