Spring Boot之Spring Data JPA

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/xufei_0320/article/details/78660310

是什么

官网如是说:

Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.

Spring Data JPA是Spring Data系列的一部分,可以轻松实现基于JPA的存储库。该模块处理基于JPA的数据访问层的增强支持。这使得构建使用数据访问层技术的Spring应用变得更加容易。

有什么

在Spring Data JPA中主要提供了几个常用的接口:
Repository: 顶层空接口
CrudRepository 继承自Repository,提供CRUD功能
PagingAndSortingRepository: 继承自CrudRepository,拓展了分页和排序功能
JpaRepository: 继承自PagingAndSortingRepository,增加了批量操作等功能
JpaSpecificationExecutor: 提供一些复杂操作等接口
继承图是这样的继承图

做什么

就是Spring基于ORM框架、JPA规范封装的一套JPA框架,可以使开发者用极少的代码即可实现对数据层对访问和操作。它提供了包括增删改查等在内等常用功能,且易于拓展。

怎么做

下面用Spring Boot整合Spring Data JPA演示一下基本用法
首先创建一个Spring Boot项目,然后引入以下依赖
依赖
做如下配置
配置
其中ddl-auto的配置指定了当项目启动的时候,会根据实体去生成对应的数据库表
搞个最简单的例子吧
假设我们有个user吧,我们假设它长这个样子吧

@Table(name = "user")
@Entity
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private Integer age;
    @Column(name = "address")
    private String address;
}

这些注解应该也都很容易理解了,@GeneratedValue(strategy = GenerationType.AUTO)指定了主键生成的策略,下一篇就专门讲一下这些主键策略,以及自定义主键策略的实现

然后我们创建我们自己的数据操作层

public interface PersonRepository extends JpaRepository<User, Integer> {
}

这样我们也就有了很多基本的功能了,这里介绍JPA的三种查询方式
1. Spring Data JPA支持通过定义在Repository接口的方法来定义查询,方法名字是根据实体类的属性名来确定的。使用findBy,And这样的关键字,其中的findBy可以用find,getBy,query,read来进行代替。

public interface UserRepository extends JpaRepository<User, Integer> {
    /**
     * 根据名字查询
     * @param name
     * @return
     */
    User findByName(String name);
}

这样我们什么都不用做,直接可以在service中调用这个方法便可以了。还可以用关键字来限制查询数量,比如:

/*
*查询符合条件的前二十条记录
*/
List<User> findFirst20ByName(String name)

2. 使用@NamedQuery查询

@Table(name = "user")
@Entity
@Data
@NamedQuery(name = "User.findByName", query = "select u.name from User u where u.name = ?1")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private Integer age;
    @Column(name = "address")
    private String address;
}

这样我们也就重新定义了接口中findByName方法,此时方法的返回值就是String了,即为user的name属性。这里还有个@NamedQueries注解,可以包含多个@NamedQuery,重新定义多个方法。
3. 使用@Query

@Query("select u from User u where u.name= :name and u.address= :address")
User withNameAndAddressQuery(@Param("name") String name,@Param("address") String address);

这种就应该很容易理解了,就不多说了。

那咋更新啊

@Modifying
@Transcational
@Query("update User u set u.name=?1 ")
int setName(String name);

示例代码

破代码

接下来

下一篇说一下关于Spring Data JPA中id的那些破事

猜你喜欢

转载自blog.csdn.net/xufei_0320/article/details/78660310