1. 程式人生 > >【ORM框架】-- Spring Data JPA(一)

【ORM框架】-- Spring Data JPA(一)

sco blog 產品 mysql- lse log 規範 dao層 標識

本文參考:spring Data JPA入門 【原創】純幹貨,Spring-data-jpa詳解,全方位介紹 Spring Data JPA系列教程--入門

一、Spring Data JPA介紹

1、什麽是JPA?什麽是Spring Data JPA?

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關系數據。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自為營的局面。值得註意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。

註意:JPA是一套規範,不是一套產品,那麽像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麽我們就可以叫他們為JPA的實現產品

Spring Data JPA 是 Spring 基於 ORM 框架(hibernate)、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴展。

2、Spring Data JPA能幹什麽?

spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現。

具體點來說就是只需要編寫一個接口,繼承spring data jpa相應接口,不需要編寫實現類,創建一個實體類,不需要創建相應的數據庫表,就可以使用基本的CRUD功能。

public interface UserRepository extends CrudRepository<User, Long>{}
3、Spring Data JPA與hibernate的關系

我們做Java開發的都知道Spring的強大,到目前為止,企業級應用Spring幾乎是無所不能,無所不在,已經是事實上的標準了,企業級應用不使用Spring的幾乎沒有,這樣說沒錯吧。而Spring整合第三方框架的能力又很強,他要做的不僅僅是個最早的IOC容器這麽簡單一回事,現在Spring涉及的方面太廣,主要是體現在和第三方工具的整合上。而在與第三方整合這方面,Spring做了持久化這一塊的工作,我個人的感覺是Spring希望把持久化這塊內容也拿下。於是就有了Spring-data-**這一系列包。包括,Spring-data-jpa,Spring-data-template,Spring-data-mongodb,Spring-data-redis,還有個民間產品,mybatis-spring,和前面類似,這是和mybatis整合的第三方包,這些都是幹的持久化工具幹的事兒。

Spring-data-jpa,表示與jpa的整合,底層都是由hibernate來實現。

4、有什麽優點?有什麽缺點?

優點:

  a、不需要寫SQL,SQL會自動生成

  b、SQL語句不依賴數據庫,移植性強,更換數據庫較為容易。

缺點:

  a、SQL優化比較困難

  b、相比mybatis入門門檻較高

5、適用場景?

適用與需求變化不多的中小型項目中,比如後臺管理,erp,orm,oa

二、Spring Data JPA結構

Spring Data JPA 提供的編程接口

  • Repository:最頂層的接口,是一個空接口,目的是為了統一所有的Repository的類型,且能讓組件掃描時自動識別。
  • CrudRepository: Repository的子接口,提供CRUD的功能。
  • PagingAndSortingRepository: CrudRepository的子接口, 添加分頁排序。
  • JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。
  • JpaSpecificationExecutor: 用來做復雜查詢的接口。

接口繼承關系圖:

技術分享圖片

三、Spring Data JPA、hibernate與Springboot集成入門實戰

1、配置環境

  MySQL:5.7.17

  Springboot:2.1.4.RELEASE

2、添加依賴  

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

  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

3、修改application.properties文件

# DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto=create-drop

4、實體User

實體的規範、註解、解析下一篇文章會詳細描述。

@Entity  // 實體
public class User implements Serializable{
 
    private static final long serialVersionUID = 1L;
    
    @Id  // 主鍵
    @GeneratedValue(strategy=GenerationType.IDENTITY) // 自增長策略
    private Long id; // 用戶的唯一標識

    @Column(nullable = false) // 映射為字段,值不能為空
     private String name;
    
    @Column(nullable = false)
    private Integer age;

    protected User() {  // JPA 的規範要求無參構造函數;設為 protected 防止直接使用 
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format(
                "User[id=%d, name=‘%s‘, age=‘%d‘]",
                id, name, age);
    }
}
5、編寫資源庫
public interface UserRepository extends CrudRepository<User, Long>{}
6、控制器
@RestController
@RequestMapping("/users")
public class UserController {
    
    @Autowired 
    private UserRepository userRepository;

    /**
     * 從 用戶存儲庫 獲取用戶列表
     * @return
     */
    private List<User> getUserlist() {
        List<User> users = new ArrayList<>();
        for (User user : userRepository.findAll()) {
            users.add(user);
        }
         return users;
    }
}
7、項目啟動前的數據庫處理

  a、啟動MySQL Server

  b、創建blog數據庫

8、啟動項目

  可以看到自動創建了數據表

【ORM框架】-- Spring Data JPA(一)