【從零入門系列-2】Spring Boot 之 數據庫實體設計實現

【從零入門系列-2】Spring Boot 之 數據庫實體設計實現

文章系列


前言

本篇文章開始代碼實踐,系統設計從底向上展開,因此本篇先介紹如何實現數據庫表實體類的設計實現。

SpringBoot數據庫的持久層框架主要分爲兩種架構模式,即以JDBC Template爲代表的SQL類和以Spring Data JPA爲代表的ORM對象類。其中:

Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴展!學習並使用 Spring Data JPA 可以極大提高開發效率!spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現,自己寫個倉儲接口後繼承JpaRepository即可實現最基本的增刪改查功能!

在使用@Entity進行實體類的持久化操作,當JPA檢測到我們的實體類當中有@Entity 註解的時候,會在數據庫中生成關聯映射對應的表結構信息,因此針對本項目情況最底層的設計實現一個@Entity註解的書籍對象定義即可。

項目開始前,先按上一篇文章【從零入門系列-1】Spring Boot 之 程序結構設計說明後臺程序結構建立相對應的目錄:

控制層:前端路由和後端處理關係處理,目錄:Controller
數據服務層:自定義對數據庫的訪問操作方法,目錄:Service
數據訪問層:實現通用的數據庫訪問功能,SpringData的JPA方案,目錄:Dao
數據實體層:定義數據庫表的屬性方法,目錄:Domain

根據結構,我們需要在Domain目錄下編寫項目表實體類,右鍵Domain文件夾,New->Java Class


編寫實體類

  1. 新建Book

    package com.arbboter.demolibrary.Domain;
    
    import javax.persistence.Entity;
    import javax.persistence.Table;
    
    /**
     * @Entity 註解該類爲數據庫表實體類,JPA可自動掃描識別到
     * @Table 註解數據表信息,其中name指定表名
     */
    @Entity
    @Table(name = "library_book")
    public class Book{
    }
    

    注意添加的類需要使用@Entity註解,其中@Table是可選的,默認不配置生成的表名和類名相同,如果上述類中不使用@Table,那麼本類對應的表名爲book

  2. 添加表字段信息

    public class Book{
        /**
         * ID,唯一主鍵,按Alt+Enter可以快速導入引入
         */
        @Id
        @GeneratedValue
        private Integer id;
    
        /**
         * 書名
         */
        private String name;
    
        /**
         * 作者
         */
        private String author;
    
        /**
         * 封面
         */
        private String image;
    }
    

    @Id註解用於聲明一個實體類的屬性映射爲數據庫的主鍵列,該屬性通常置於屬性聲明語句之前,可與聲明語句同行,也可寫在單獨行上。

    @GeneratedValue用於註解主鍵的生成策略,通過strategy 屬性指定。默認情況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。

    • TABLE:使用一個特定的數據庫表格來保存主鍵。
    • SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
    • IDENTITY:主鍵由數據庫自動生成(主要是自動增長型)
    • AUTO:主鍵由程序控制。

    該註解的strategy屬性默認值爲GenerationType.AUTO

  1. 利用IDEA自動添加getter setter toString方法

    @Entity
    @Table(name = "library_book")
    public class Book{
        /**
         * 屬性此處未列出
         */
    
        /**
         * 按Alt+Insert 或者 在此文件空白處右鍵選擇Generate...
         * 自動生成getter和setter及toString方法
         */
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getImage() {
            return image;
        }
    
        public void setImage(String image) {
            this.image = image;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", image='" + image + '\'' +
                    '}';
        }
    }
    

    建議按Alt+Insert 或者 在此文件空白處右鍵選擇Generate...自動生成gettersettertoString方法,其中toString方便輸出查閱。

  2. 啓動測試

    此時啓動main函數發現,程序正常啓動,但是查看數據庫我們可以發現數據庫表library_book並沒有自動生成,因爲到這裏我們還沒有自定義配置JPA。

    這裏先配置上JPA的配置,本項目使用的SQL Server 2008數據庫,在application.properties配置文件中新增以下配置信息:

    # JPA配置
    spring.jpa.database=sql_server
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jpa.database-platform=org.hibernate.dialect.SQLServer2008Dialect
    

    建議以上配置項都設置上,我在學習過程中因沒有配置spring.jpa.database-platform項,導致項目啓動失敗。配置spring.jpa.hibernate.ddl-auto取值含義爲:

    • ddl-auto:create----每次運行該程序,沒有表格會新建表格,表內有數據會清空
    • ddl-auto:create-drop----每次程序結束的時候會清空表
    • ddl-auto:update----每次運行程序,沒有表格會新建表格,表內有數據不會清空,只會更新
    • ddl-auto:validate----運行程序會校驗數據與數據庫的字段類型是否相同,不同會報錯

    新增該配置後再次啓動程序,我們可以在輸出欄看到類似這樣的輸出:

    2019-05-14 12:09:34.977  INFO 115652 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.SQLServer2008Dialect
    Hibernate: create table library_book (id int not null, author varchar(255), image varchar(255), name varchar(255), primary key (id))
    

    從日誌中我們可以看出,程序已經自動創建了book的實體類了,可以在數據庫中驗證發現,該表已創建OK。


註解說明

  • @Table - 映射表名

    @Table註解用來標識實體類與數據表的對應關係,默認和類名一致。

  • @Id - 主鍵

  • @GeneratedValue(strategy=GenerationType.IDENTITY) - 自動遞增生成

  • @Column(name = “dict_name”,columnDefinition=“varchar(100) COMMENT ‘字典名’”) - 字段名、類型、註釋

    Column註解來標識實體類中屬性與數據表中字段的對應關係,其屬性均爲可選屬性:

    • name屬性定義了被標註字段在數據庫表中所對應字段的名稱;
    • unique屬性表示該字段是否爲唯一標識,默認爲false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
    • nullable屬性表示該字段是否可以爲null值,默認爲true。如果屬性裏使用了驗證類裏的@NotNull註釋,這個屬性可以不寫。
    • insertable屬性表示在使用“INSERT”腳本插入數據時,是否需要插入該字段的值。
    • updatable屬性表示在使用“UPDATE”腳本插入數據時,是否需要更新該字段的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。
    • columnDefinition屬性表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。若不指定該屬性,通常使用默認的類型建表,若此時需要自定義建表的類型時,可在該屬性中設置。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
    • table屬性定義了包含當前字段的表名。
    • length屬性表示字段的長度,當字段的類型爲varchar時,該屬性纔有效,默認爲255個字符。
    • precision屬性和scale屬性表示精度,當字段類型爲double時,precision表示數值的總長度,scale表示小數點所佔的位數。
  • @UpdateTimestamp - 更新時自動更新時間

  • @CreationTimestamp - 創建時自動更新時間

  • @Version - 版本號,更新時自動加1


結束語

本章內容記錄了數據庫實體類的簡單的實現方式,並通過application.properties配置JPA的數據庫配置項,使得程序運行後能自動關聯並操作數據庫表。下一章將介紹對數據庫的增刪改查(CRUD)操作相關內容,請繼續關注。

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