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

文章系列


前言

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

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

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

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

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

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

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


編寫實體類

1.新建Booksegmentfault

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.添加表字段信息springboot

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。app

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

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

3.利用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方便輸出查閱。

4.啓動測試

此時啓動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)操做相關內容,請繼續關注

相關文章
相關標籤/搜索