SpringBoot系列:SpringDataJpa持久层常用操作和SpringDataJpa中的事务 | 8月更文挑战

547 阅读5分钟

微信图片_2021051215570111.png

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

📖前言

不要只是做个工具人!

因为日常的编写简单业务需求,导致自己像个工具人一样,日久天长的也就很少去深入学习更多技术栈。看见有工具、有组件、有框架,拿来就用用,反正没什么体量也不会出什么问题。但如果你想要更多的收入,哪怕是重复的造轮子,你也要去尝试造一个,就算不用到生产,自己玩玩总可以吧。有些事情只有自己经历过,才能有最深的感触,参与过实践过,才好总结点评学习。

SpringDataJPA 是 Spring Data 技术下的子项目,使用SpringDataJPA 访问数据只需要数据访问层接口实现 JpaRepository接口即可。由于 JpaRepository接口继承了PagingAndSortingRepository接口,所以也有它的一些 功能。

欢迎关注我的 SpringDataJpa专栏


🎈默认继承方法

在这里插入图片描述

前面的案例中已经介绍了添加的方法,那如下我们需要查找一个或者多个,删除一个或者多个该如何做呢,查找单个或 者多个,我们只需要在上一个案例的基础上,在com.cyj.springboot.controller下的StudentController类下,添 加如下代码:

/** * http://localhost:8090/findOne?id=1 
* @param id 
* @return student */ 
@RequestMapping("/findOne") 
public Object findStudentById(int id) { 
    Student student = repository.findOne(id); 
    return student; 
}

查询单个运行效果如下:

在这里插入图片描述


🎆关键字抽象方法

  • 按照Spring Data 的规则,我们可以通过定义在Repository接口下的方法来执行查询等自定义操作,查询的方法必 须以find、get、read开头,同时涉及条件查询时,SpringDataJpa支持将条件属性定义在数据访问层接口下的方法 名中。其中命名约定如下
    • 条件属性通过条件关键字连接。
    • 条件属性的首字母必须大写

🎇SpringDataJpa解析方法吗的原则

框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。并且如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。如下表列举部分关键字抽象方法的含义:

在这里插入图片描述

  • And — 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
  • Or — 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
  • Between — 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
  • 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 中的 “order by”,比如 findByUsernameOrderBySalaryAsc(String user);
  • Not — 等价于 SQL 中的 “! =”,比如 findByUsernameNot(String user);
  • In — 等价于 SQL 中的 “in”,比如 findByUsernameIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
  • NotIn — 等价于 SQL 中的 “not in”,比如 findByUsernameNotIn(Collection userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

✨SpringDataJpa关键字抽象方法的使用

在上一个案例基础上(传送门:SpringBoot系列:SpringBoot项目中使用Jpa(SpringDataJpa) | 八月更文挑战),查找姓名中包含“刘”的全部学生信息。

在com.cyj.springboot.repository下配置StudentRepository类中添加如下代码:

public interface StudentRepository extends JpaRepository<Student, Integer>{ 
    //根据姓名模糊查找学生信息 
    public List<Student> findByStudentNameContaining(String name); 
}

在StudentController类下添加如下代码:

/*** 
* http://localhost:8090/findStudentByName?name=刘 
* @param name 
* @return */ 
@RequestMapping("/findStudentByName") 
public Object findStudentByName(String name) {             
    List<Student> student = repository.findByStudentNameContaining(name); return student; 
}

启动测试,运行效果如下:

在这里插入图片描述


🎊操作单个对象的事务

Spring Data提供了默认的事务(Transactionality)处理方式,即所有的查询均声明为只读事务,对于持久化,更新与删除对象声明为有事务。 参见:org.springframework.data.jpa.repository.support.SimpleJpaRepository<T,ID>

@org.springframework.stereotype.Repository 
@Transactional(readOnly = true) 
public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    ……
    @Transactional 
    public void delete(ID id) { 
        delete(findOne(id)); 
    }
    …… 
}

对于自定义的方法,如需改变spring data提供的事务默认方式,可以在方法上注解@Transactional声明,如下示例:

@Transactional 
@Modifying 
@Query("update Student s set s.studentName=?1 where s.studentId=?2") 
int setFixedStudentNameFor(String studentName,int studentId);

🎎涉及多个 Repository的事务处理

进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个Repository的调用,并在相应的方法上声明事务。

只要在方法的上面加上@Transaction 这个注解就可以轻轻松松的实现事务的操作了。不过这里有几点需要注意的是:

  • 这个注解实现的事务管理器是默认的,如果不想要默认是事务管理器,可以自己进行添加。
  • 事务的隔离级别也是可以自己设置的。
  • 事务的传播行为也是可以自己设置的

好了到这里也该结束了,下一篇讲解--SpringDataJpa常用的注解标签和自定义查询语句(JPQL),各位要自己多动手才能学到真正的东西。加油各位


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!