用心去看才看得清楚,本质的东西用肉眼是看不见的。——圣爱克苏佩里,《小王子》
今天的内容有点多,希望你能耐心看完,因为会复习 Spring Boot 和 Sping 的相关内容。
Java持久性API(JPA)是一个对象关系映射(ORM)框架,它是Java EE平台的一部分。
JPA通过让开发人员使用面向对象的API,而不是手动编写SQL查询来简化数据访问层的实现。目前,流行的JPA框架有Hibernate,EclipseLink和OpenJPA。而 Spring 框架本身也提供了一个Spring ORM模块,以便与ORM框架轻松集成。
除此之外,我们还可以在JPA中使用Spring的声明式事务管理功能。
除了Spring ORM模块之外,Spring家族还提供了一个Spring Data,主要专注用于访问关系数据库和NoSQL数据库。
现在,Spring Data已经集成了大多数流行的数据访问技术,包括JPA,MongoDB,Redis,Cassandra,Solr,ElasticSearch等。
本文我们将探寻Spring Data JPA,并实战演示如何将它与Spring Boot一起使用,以及如何在同一个Spring Boot应用程序中使用多个数据库方法。
Spring Data JPA
在不使用Spring Boot的情况下,我们配置数据存储,通常需要自行配置各种Bean,如DataSource
,TransactionManager
,LocalContainerEntityManagerFactoryBean
等。
而使用Spring Boot JPA的Starter:spring-boot-starter-data-jpa
便能快速启动并运行JPA了。
但是,在介绍如何使用spring-boot-starter-data-jpa之前,我们先来看看Spring Data JPA。
很多时候,我们可能需要进行数据管理应用程序的开发,对于这些程序,本质上,我们是做的CRUD(创建,读取,更新,删除)操作。
过去,我们需要一遍又一遍的写类似的操作代码,也就是我们最为熟悉的DAO层。
而Spring Data的出现,极大的改善了这种情况,我们不再一次又一次地执行相同的CRUD操作,或者每一个项目都需要实现自己的所谓“通用”的CRUD DAO实现,而直接使用,如CrudRepository
,PagingAndSortingRepository
,JpaRepository
等的功能,这些功能提是开箱即用,包含了操作以及分页和排序等方法。
比如,JpaRepository的接口方法,如下图:
如图所示,JpaRepository提供了几种CRUD操作方法:
- long count()—— 返回可用实体的总数
- boolean existsById(ID id)—— 返回是否存在具有给定ID的实体
- List findAll(Sort sort)—— 返回按给定选项排序的所有实体
- Page findAll(Pageable pageable)—— 返回满足Pageable对象中提供的分页限制的实体
Spring Data JPA不仅提供了开箱即用的CRUD操作,还支持基于方法名称的动态查询生成功能。
比如,定义一个findByEmail(String email)方法,Spring Data将自动生成带有where子句的查询,如“where email =?1”。
再比如,定义一个findByEmailAndPassword(String email,String password)方法,Spring Data 将自动生成带有where子句的查询,如“where email =?1 and password =?2”所示。
但有时候,我们可能因为某些原因(比如,代码安全,编码规范等)而无法直接使用基于方法名称的动态查询,Spring Data 便提供了使用@Query
注释显式配置来增强查询的灵活性。
@Query("select u from User u where u.email=?1 and u.password=?2 and u.enabled=true")
User findByEmailAndPassword(String email, String password);
还可以使用@Modifying和@Query执行数据更新操作,如下所示:
@Modifying
@Query("update User u set u.enabled=:status")
int updateUserStatus(@Param("status") boolean status)