Spring Data JPA基于JPA(Java Persistence API)标准,提供了一套用于简化数据访问层开发的抽象。它通过简化常用的CRUD操作,减少了开发人员需要编写的代码量,提高了开发效率。本文将重点介绍如何将Spring Data JPA集成到Springboot项目中,并且配置持久层。
DAO层通常都是一些固定模式的代码,因此我们可以将其简化,这样做有一些好处:固定模式的文件和代码我们可以不用编写和维护。
而使用Spring Data JPA我们甚至可以不用编写DAO的实现,我们需要做的只是显示的定义接口。
使用Spring Data JPA我们需要继承JPA的特定接口JpaRepository,这样Spring Data就会自动找到这个接口并自动为其创建实现类。
而继承这个接口之后我们就可以使用标准的CRUD去访问数据库了。
通过继承JpaRepository,我们已经可以使用基本的CRUD了,如果要使用自定义的方法,JPA提供了一些选择:
其中Specification和Querydsl有些类似于JPA Criteria,但其更加灵活,整体也更加具有可读性和可复用性,尤其是对于大量的固定查询。
当Spring Data创建一个新的Repository实现时,它会分析接口定义的所有方法,并尝试从方法名称自动生成查询。尽管这种方式有一些限制,但不能否认它是一种非常强大,可以轻松定义新的自定义访问方法。
public interface MyEntityRepository extends JpaRepository {
MyEntity findByName(String name);
}
Jpa会自动生成如下Query
SELECT e FROM MyEntity e WHERE e.name = :name
Spring Data提供了一个强大的查询创建机制,支持广泛的关键字和表达式。通过遵循命名约定和方法签名,Spring Data可以推断方法的意图并动态生成相应的查询。
值得注意的是,查询创建机制非常灵活,也可以处理更复杂的场景。并且可以使用额外的关键字,如"OrderBy"、"IgnoreCase",或者结合多个字段和条件来创建更具体的查询。
我们可以使用@Query注解来手动查询
@Query("SELECT f FROM MyEntity f WHERE LOWER(f.name) = LOWER(:name)")
MyEntity retrieveByName(@Param("name") String name);
事实上,我们不常接触Spring管理的DAO,但是它有默认实现SimpleJpaRepository。
它在类级别使用了一个只读的@Transactional注解,然后针对非只读方法进行了覆盖。其余的事务语义是默认的,但可以通过手动方式对方法进行覆盖。
SimpleJpaRepository是Spring Data JPA提供的默认实现。它提供了标准的CRUD操作和其他常见的数据访问方法。默认情况下,它使用事务语义,其中读操作被标记为只读事务,写操作被标记为非只读事务。
我们可以使用@EnableJpaRepositories注解,并指定包含DAO接口的包:
@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository")
public class JpaConfiguration {
...
}
在上面的示例中,basePackages
参数指定了包含DAO接口的包的路径。
此注解应该与其他配置一起使用,例如@Configuration注解,以确保它被正确加载到应用程序上下文中。
org.springframework.data
spring-data-jpa
2.4.0
添加该依赖项后,Maven将下载并添加所需的Spring Data JPA库到项目中。这样,您就可以在应用程序中使用Spring Data JPA提供的功能和特性了。
我们还可以使用Spring Boot Starter Data JPA依赖项,它将自动为我们配置DataSource。
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
1.4.200
只需添加这些依赖项,我们的应用程序就可以运行起来。