Spring Data Jpa 使用方法 轻松做数据持久化

Spring data jpa 不管是搭建环境还是书写代码可以说都简单到爆了。这正是Spring 框架广受java从业者喜欢的因素,简单优雅高效。我们可以先搭建一个Spring MVC项目,或者更简单的,可以快速生成一个Spring Boot项目。另外需要知道Spring data jpa只是对JPA的实现产品进行了一个封装,它并不具备操作数据库的详细code,所以一般是和一个实现JPA接口的产品一起使用的,比如hibernate-jpa。

如果是Spring MVC项目,那么请加入下面依赖,版本自己选择:

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.2.Final</version>
</dependency>

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>

如果是Spring Boot项目,非常简单,加入这个(默认包括了hibernate依赖):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>

好了,工具就绪了,开干。

新建一个BaseRepository接口,有点类似BaseDao,但这个接口我们不需要做任何事情,尽尽方便其他Repository继承。

@NoRepositoryBean
public interface BaseRepository<T, ID> extends JpaRepository<T, ID> {
}

简单吧,为什么要把这个抽出来而不是直接继承JpaRepository接口呢,原因是有可能我们还要继承更多的JPA接口,比如JpaSpecificationExecutor等,这些不同的接口里面有不同的方法,看你个人需要。但是作为其他的Repository,就只需要继承这个BaseRepository。@NoRepositoryBean注解的效果就是让Spring不要扫荡这个BaseRepository,因为它没有任何实体类的持久化操作。

接下来,写个具体的Repository,BaseRepository的第一个类型参数是需要持久化的实体,第二个类型参数是ID的类型:

public interface MessageRepository extends BaseRepository<Message, Long> {
}

不需要加任何注解它就能被Spring扫荡到,因为Spring会默认扫荡所有继承JpaRepository的接口,并未他们添加实现。我们只需要定义一些方法,然后再上面加@Query注解。甚至可以任何方法都不加,因为JpaRepository里面已经具备了增删改查的所有接口了。

@Query("select m from Message m where m.subject = ?1")
List<Message> findBySubject(String subject);

这就是一个加@Query的示例,这个注解里面用的是JQL语法,和SQL很相似,非常简单,并且也足以支撑百分之九十业务需要。另外,Spring data jpa还提供了更为简单的方法名查询,比如:

List<Message> findMessageBySubject(String subject);

它会默认去找Message表的subject字段,方法名查询的规则可以去翻阅Spring data jpa文档。

如果需要做更新的话,需要加上@Modifying注解,表示这是一个增删改操作。

好了,repository这里面就几乎结束啦,和JAP的初次会面也结束咯。是不是很简单!接下来你只需要在Dao里面或者Service里面加入下面这个注入,就能操作数据库啦:

@Autowired
private MessageRepository messageRepository;

有这些方法供你玩:

List<T> findAll(); //查所有

List<T> findAll(Sort var1);

List<T> findAllById(Iterable<ID> var1);

<S extends T> List<S> saveAll(Iterable<S> var1); //批量插入

void flush();

<S extends T> S saveAndFlush(S var1); //添加或更新(ID为空,添加,ID不为空,更新)

void deleteInBatch(Iterable<T> var1);

void deleteAllInBatch();

T getOne(ID var1); //查单个

<S extends T> List<S> findAll(Example<S> var1);

<S extends T> List<S> findAll(Example<S> var1, Sort var2);

自己慢慢研究下吧!

原文地址:https://www.cnblogs.com/cnsec/p/13407181.html