SpringDataJPA持久层操作

Spring Data JPA 持久层操作

  • 持久层即Repository层,也叫Dao层
  • Spring Data JPA 是 Spring Data 技术下的子项目,使用 Spring Data JPA 访问数据只需要数据访问层接口继承 JpaRepository 接口即可。JpaRepository 接口继承了 PagingAndSortingRepository,QueryByExampleExecutor 接口,所以拥有了它们的 CRUD 操作功能。持久层真正起作用的是接口对应的实现类,在程序执行的过程中,帮我们动态地生成了接口的实现类对象,通过 JdkDynamicAopProxy 创建动态代理对象 Simp
    leJpaRepository,执行对数据库的一系列操作。持久层对数据库的操作有接口中默认继承方法、关键字抽象方法、自定义查询语句(JPQL)、原生 SQL

默认继承方法

定义参数返回值说明
<S extends T> S save(S entiry)对象对象保存
<S extends T> S saveAndFlush(S entiry)对象对象保存,并强制同步到DB中
<S extends T> List<S> save(Iterable<? extends T> entities)对象列表对象列表批量保存
<S extends T> Iterable<S> save(Iterable<S> entities)对象列表可迭代容器批量保存
void delete(ID id)IDvoid删除一个
void delete(I entity)对象void删除一个
void delete(Iterable<? extends T> entities)对象列表void批量删除,后台执行时,一条一条删除
void deleteInBatch(Iterable<T> entities)对象列表void批量删除,后台执行时,生成一条语句执行,用多个OR条件
void deleteAll()voidvoid删除所有,后台执行时,一条一条删除
void deleteAllInBatch()voidvoid删除所有,执行一条语句
T findOne(ID id)ID对象查找一个对象,对象不存在时,返回null
T getOne(ID id)ID对象引用查找一个对象,对象不存在时,返回不是null,但各个属性值是null
List<T> findAll(Iterable<ID> ids)ID列表对象列表查找一批对象
List<T> findAll()void对象列表查找所有对象
List<T> findAll(Sort sort)void对象列表查找所有对象,并排序
Page<T> findAll(Pageable pageable)voidPage查找所有对象,并分页和排序
Iterable<T> findAll(Iterable<ID> ids)ID列表可迭代容器查找一批对象
Iterable<T> findAll()void可迭代容器查找所有对象,并排序
boolean exists(ID id)IDboolean判断对象是否存在
long count()voidlong计算总数量
void flush()voidvoid强制同步DB

关键字抽象方法

Spring Data JPA 支持将条件属性定义在数据访问层接口下的方法名中

  • 命名约定
    1. 条件属性通过条件关键字连接
    2. 条件属性的首字母必须大写
  • Spring Data JPA 解析方法名的原则
    框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。如下表列举部分关键字抽象方法的含义:
KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastNameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
BetweenfindByStartDateBetween… where x.startDate between 1? and ?2
LessThanfindByAgeLessThan… where x.age < ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate > ?1
IsNullfindByAgeIsNull… where x.age is null
NotNull、IsNotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFristnameLike… where firstname like ?1
NotLikefindByFristnameNotLike… where firstname not like ?1
StartingWithfindByFristnameStartingWith… where x.firstname like ?1(parameter bound with appended %)
EndingWithfindByFristnameEndingWith… where x.firstname like ?1(parameter bound with prepended %
ContainingfindByFristnameContaining… where x.firstname like ?1(parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection age)… where age in ?1
NotInfindByAgeNotIn(Collection age)… where age not in ?1
TruefindByActiveTrue… where x.active = true
FalsefindByActiveFalse… where x.active = false
  • And:等价于 SQL 中的AND关键字,比如findByUsernameAndPassword(String user, Striang pwd)根据用户名字和密码查找
  • Or :等价于 SQL 中的OR关键字,比如 findByUsernameOrAddress(String user, String addr)根据用户名或地址查找
  • Between:等价于 SQL 中的BETWEEN关键字,比如findBySalaryBetween(int max, int min)查询薪资在min 和 max 之间
  • LessThan:等价于 SQL 中的 <,比如findBySalaryLessThan(int max)
  • GreaterThan:等价于 SQL 中的>,比如 findBySalaryGreaterThan(int min)
  • IsNull:等价于 SQL 中的 IS NULL,比如 findByUsernameIsNull();
  • IsNotNull:等价于 SQL 中的 IS NOT NULL,比如findByUsernameIsNotNull()
  • NotNull:与 IsNotNull 等价
  • Like:等价于 SQL 中的 LIKE,比如 findByUsernameLike(String user)
  • NotLike:等价于 SQL 中的 NOT LIKE,比如 findByUsernameNotLike(String user)
  • OrderBy:等价于 SQL 中的 OREDR BY,比如 findByUsernameOrderBySalaryAsc(String user)
  • Not: 等价于 SQL 中的 <>,比如 findByUsernameNot(String user)
  • In:等价于 SQL 中的IN,比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection类型,也可以是数组或者不定长参数
  • NotIn:等价于 SQL 中的NOT IN,比如findByUsernameNotIn(Collection userList) ,方法的参数可以是Collection 类型,也可以是数组或者不定长参数

自定义语句(JPQL)

说明:JPQL 不支持 INSERT 语句
@Query注解中的Student:表示实体类、studentId:表示实体类中的属性

  • 索引参数

索引值从?1开始,查询中?X个数需要与方法定义的参数个数相一致, 并且顺序也要一致

1.查询语句的的使用(SELECT)
例:通过学生编号查询学生

// 方法名可以自定义
@Query("select s from Student s where studentId = ?1") 
Student findStudentById(Integer studentId);

2.更新语句的的使用(DELETE、UPDATE)
例:通过学生编号删除学生

// 方法名可以自定义
@Transactional
@Modifying 
@Query("delete Student where studentId=?1") 
int deleteById(Integer studentId);

例:通过学生编号修改学生姓名

// 方法名可以自定义
@Transactional
@Modifying 
@Query("update Student s set studentName=?1 where studentId=?2") 
int updateNameById(String studentName,Integer studentId);

说明:要执行更新操作,将 JPQL 语句放到@Query注解中,还要结合@Modifying注解才可以识别执行更新操作,还需要使用@Transcational进行事务处理,三个注解缺一不可

  • 命名参数

赋值时采用@Param("paramName"),无顺序要求
@Query注解中,用:paramName来接收参数

1.自定义查询语句的的使用(SELECT)
例:通过学生姓名模糊查询

// 方法名可以自定义
@Query("select s from Student s where studentName like %:name% ") 
List<Student> queryByName(@Param(value = "name") String studentName);

2.自定义更新语句的的使用(INSERT、DELETE、UPDATE)
例:通过学生编号修改学生姓名

// 方法名可以自定义
@Transactional
@Modifying 
@Query("update Student s set studentName=:name where studentId=:id") 
int updateNameById(@Param(value="name")String studentName,@Param(value="id")Integer studentId);

原生SQL

使用方式和JPQL的使用方式基本一样,其中@Query中的value属性不能省略,并且要开启nativeQuery属性
例:通过学生编号修改学生姓名

// 方法名可以自定义
@Transactional
@Modifying 
@Query(value="update student set student_name=?1 where student_id=?2",nativeQuery = true) 
int updateNameById(String studentName,Integer studentId);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值