Spring Boot之Spring Data JPA

是什麼

官網如是說:

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的那些破事

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章