SpringBoot整合Spring Data JPA

本篇要點

  • 簡單介紹JPA。html

  • 介紹快速SpringBoot快速整合JPAjava

JPA是啥?

The Java Persistence API is a standard technology that lets you 「map」 objects to relational databases. The spring-boot-starter-data-jpa POM provides a quick way to get started.mysql

  • JPA是The Java Persistence API標準,Java持久層API,是一種能讓對象可以快速映射到關係型數據庫的技術規範。
  • JPA只是一種規範,它須要第三方自行實現其功能,在衆多框架中Hibernate是最爲強大的一個。

Spring Data JPA

Spring Data JPA 是採用基於JPA規範的Hibernate框架基礎下提供了Repository層的實現。Spring Data Repository極大地簡化了實現各類持久層的數據庫訪問而寫的樣板代碼量,同時CrudRepository提供了豐富的CRUD功能去管理實體類。SpringBoot框架爲Spring Data JPA提供了整合,spring-boot-starter-data-jpa可以讓你快速使用這門技術,它提供瞭如下依賴。git

  • Hibernate:最流行的JPA實現之一。
  • Spring Data JPA:幫助你去實現JPA-based repositories。
  • Spring ORM:Spring Framework提供的核心ORM支持。

快速SpringBoot快速整合JPA

引入依賴

<!--SpringBoot對jpa的封裝-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--mysql驅動,8.x版本-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

配置yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    #在建表的時候,將默認的存儲引擎切換爲 InnoDB
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    # 配置在日誌中打印出執行的 SQL 語句信息。
    show-sql: true
    # 配置指明在程序啓動的時候要刪除而且建立實體類對應的表。
    hibernate:
      ddl-auto: create #update

值得注意的是:spring.jpa.hibernate.ddl-auto第一建表的時候能夠create,指明在程序啓動的時候要刪除而且建立實體類對應的表。後續使用就須要改成update。spring

ddl-auto的幾種屬性值

  • create:每次加載hibernate時都會刪除上一次的生成的表,再從新根據model生成表,所以可能會致使數據丟失。
  • create-drop :每次加載hibernate時根據model類生成表,可是sessionFactory一關閉,表就自動刪除
  • update:最經常使用的屬性,第一次加載hibernate時根據model類會自動創建起表的結構(前提是先創建好數據庫),之後加載hibernate時根據 model類自動更新表結構,原有數據不會清空,只會更新。
  • validate :每次加載hibernate時,會校驗數據與數據庫的字段類型是否相同,字段不一樣會報錯

實體類

JPA規範定義在javax.persistence包下,注意導包的時候不要導錯。sql

@Entity(name = "t_user")
@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;


    @Transient
    private String email;

}
  • @Entity標註保證明體可以被SpringBoot掃描到,對應表名爲t_user數據庫

  • @Id代表id。springboot

  • @GeneratedValue中標註主鍵生成策略。session

  • @Transient表示不須要映射的字段。框架

常見的主鍵生成策略

  • TABLE: 使用一個特定的數據庫表格來保存主鍵
  • SEQUENCE: 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。這個值要與generator一塊兒使用,generator 指定生成主鍵使用的生成器(多是orcale中本身編寫的序列)。
  • IDENTITY: 主鍵由數據庫自動生成(主要是支持自動增加的數據庫,如mysql)
  • AUTO: 主鍵由程序控制,也是GenerationType的默認值。

啓動項目,生成表

首先在數據庫中建立jpa庫,庫名無所謂,和配置對應上就能夠。

啓動項目,你會發現控制檯輸出日誌以下:

Hibernate: drop table if exists t_user
Hibernate: create table t_user 
    (id bigint not null auto_increment, password varchar(255), username varchar(255), primary key (id)) engine=InnoDB

此時咱們配置的create效果已經顯現,咱們以後將它改成update,否則每次啓動程序,數據表又得重建咯。

數據訪問層

Working with Spring Data Repositories

Spring Data JPA repositories是你能夠定義訪問數據的接口,JPA查詢是根據你的方法名稱自動建立的。

這裏咱們編寫一個接口,繼承JpaRepository便可。User是對象名,不是表名,Long爲主鍵的類型。

public interface UserDao extends JpaRepository<User, Long> {

    /**
     * 根據用戶名和密碼查詢用戶
     */
    User findByUsernameAndPassword(String username, String password);
}

JPA默認支持常見的增刪改查,也支持findByUsernameAndPassword這種以字段命名的方法,對於更復雜的查詢,您能夠使用Spring Data的Query註解對方法進行註解。

命名規範與對應SQL

測試JPA

@SpringBootTest
class SpringBootJpaApplicationTests {

    @Resource
    UserDao userDao;

    @Test
    void testJPA() {
        User user = userDao.save(new User(null, "summerday", "123456", "hangzhou"));
        System.out.println("添加用戶: " + user);
        User u = userDao.findByUsernameAndPassword("summerday", "123456");
        System.out.println("根據用戶名和密碼查詢用戶: " + u);
        long count = userDao.count();
        System.out.println("當前用戶數量: " + count);
        PageRequest page = PageRequest.of(0, 5, Sort.by(Sort.Order.desc("id")));
        Page<User> all = userDao.findAll(page);
        System.out.println("分頁 + 根據id逆序 查詢結果: " + all.getContent());
        if(userDao.existsById(u.getId())) {
            userDao.deleteById(u.getId());
            System.out.println("刪除id爲" + u.getId()+ "的用戶成功");
        }
        long c = userDao.count();
        System.out.println("剩餘用戶數爲: " + c);
    }
}

控制檯輸出以下:

5、源碼下載

本文內容均爲對優秀博客及官方文檔總結而得,原文地址均已在文中參考閱讀處標註。最後,文中的代碼樣例已經所有上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn,另有其餘SpringBoot的整合哦。

參考閱讀

相關文章
相關標籤/搜索