摘要:文章系列從零入門系列之從零入門系列之程序結構設計說明前言本篇文章開始代碼實踐,系統(tǒng)設計從底向上展開,因此本篇先介紹如何實現(xiàn)數(shù)據(jù)庫表實體類的設計實現(xiàn)。主鍵由數(shù)據(jù)庫自動生成主要是自動增長型主鍵由程序控制。
文章系列
【從零入門系列-0】Sprint Boot 之 Hello World
【從零入門系列-1】Sprint Boot 之 程序結構設計說明
前言本篇文章開始代碼實踐,系統(tǒng)設計從底向上展開,因此本篇先介紹如何實現(xiàn)數(shù)據(jù)庫表實體類的設計實現(xiàn)。
SpringBoot數(shù)據(jù)庫的持久層框架主要分為兩種架構模式,即以JDBC Template為代表的SQL類和以Spring Data JPA為代表的ORM對象類。其中:
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎上封裝的一套JPA應用框架,可使開發(fā)者用極簡的代碼即可實現(xiàn)對數(shù)據(jù)的訪問和操作。它提供了包括增刪改查等在內(nèi)的常用功能,且易于擴展!學習并使用 Spring Data JPA 可以極大提高開發(fā)效率!spring data jpa讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴于它來實現(xiàn),自己寫個倉儲接口后繼承JpaRepository即可實現(xiàn)最基本的增刪改查功能!
在使用@Entity進行實體類的持久化操作,當JPA檢測到我們的實體類當中有@Entity 注解的時候,會在數(shù)據(jù)庫中生成關聯(lián)映射對應的表結構信息,因此針對本項目情況最底層的設計實現(xiàn)一個@Entity注解的書籍對象定義即可。
項目開始前,先按上一篇文章【從零入門系列-1】Sprint Boot 之 程序結構設計說明后臺程序結構建立相對應的目錄:
控制層:前端路由和后端處理關系處理,目錄:Controller 數(shù)據(jù)服務層:自定義對數(shù)據(jù)庫的訪問操作方法,目錄:Service 數(shù)據(jù)訪問層:實現(xiàn)通用的數(shù)據(jù)庫訪問功能,SpringData的JPA方案,目錄:Dao 數(shù)據(jù)實體層:定義數(shù)據(jù)庫表的屬性方法,目錄:Domain
根據(jù)結構,我們需要在Domain目錄下編寫項目表實體類,右鍵Domain文件夾,New->Java Class。
編寫實體類1.新建Book類
package com.arbboter.demolibrary.Domain; import javax.persistence.Entity; import javax.persistence.Table; /** * @Entity 注解該類為數(shù)據(jù)庫表實體類,JPA可自動掃描識別到 * @Table 注解數(shù)據(jù)表信息,其中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注解用于聲明一個實體類的屬性映射為數(shù)據(jù)庫的主鍵列,該屬性通常置于屬性聲明語句之前,可與聲明語句同行,也可寫在多帶帶行上。
@GeneratedValue用于注解主鍵的生成策略,通過strategy 屬性指定。默認情況下,JPA 自動選擇一個最適合底層數(shù)據(jù)庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
TABLE:使用一個特定的數(shù)據(jù)庫表格來保存主鍵。
SEQUENCE:根據(jù)底層數(shù)據(jù)庫的序列來生成主鍵,條件是數(shù)據(jù)庫支持序列。
IDENTITY:主鍵由數(shù)據(jù)庫自動生成(主要是自動增長型)
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...自動生成getter和setter及toString方法,其中toString方便輸出查閱。
4.啟動測試
此時啟動main函數(shù)發(fā)現(xiàn),程序正常啟動,但是查看數(shù)據(jù)庫我們可以發(fā)現(xiàn)數(shù)據(jù)庫表library_book并沒有自動生成,因為到這里我們還沒有自定義配置JPA。
這里先配置上JPA的配置,本項目使用的SQL Server 2008數(shù)據(jù)庫,在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----每次運行該程序,沒有表格會新建表格,表內(nèi)有數(shù)據(jù)會清空
ddl-auto:create-drop----每次程序結束的時候會清空表
ddl-auto:update----每次運行程序,沒有表格會新建表格,表內(nèi)有數(shù)據(jù)不會清空,只會更新
ddl-auto:validate----運行程序會校驗數(shù)據(jù)與數(shù)據(jù)庫的字段類型是否相同,不同會報錯
新增該配置后再次啟動程序,我們可以在輸出欄看到類似這樣的輸出:
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))
從日志中我們可以看出,程序已經(jīng)自動創(chuàng)建了book的實體類了,可以在數(shù)據(jù)庫中驗證發(fā)現(xiàn),該表已創(chuàng)建OK。
注解說明@Table - 映射表名
@Table注解用來標識實體類與數(shù)據(jù)表的對應關系,默認和類名一致。
@Id - 主鍵
@GeneratedValue(strategy=GenerationType.IDENTITY) - 自動遞增生成
@Column(name = "dict_name",columnDefinition="varchar(100) COMMENT "字典名"") - 字段名、類型、注釋
Column注解來標識實體類中屬性與數(shù)據(jù)表中字段的對應關系,其屬性均為可選屬性:
name屬性定義了被標注字段在數(shù)據(jù)庫表中所對應字段的名稱;
unique屬性表示該字段是否為唯一標識,默認為false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
nullable屬性表示該字段是否可以為null值,默認為true。如果屬性里使用了驗證類里的@NotNull注釋,這個屬性可以不寫。
insertable屬性表示在使用“INSERT”腳本插入數(shù)據(jù)時,是否需要插入該字段的值。
updatable屬性表示在使用“UPDATE”腳本插入數(shù)據(jù)時,是否需要更新該字段的值。insertable和updatable屬性一般多用于只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。
columnDefinition屬性表示創(chuàng)建表時,該字段創(chuàng)建的SQL語句,一般用于通過Entity生成表定義時使用。若不指定該屬性,通常使用默認的類型建表,若此時需要自定義建表的類型時,可在該屬性中設置。(也就是說,如果DB中表已經(jīng)建好,該屬性沒有必要使用。)
table屬性定義了包含當前字段的表名。
length屬性表示字段的長度,當字段的類型為varchar時,該屬性才有效,默認為255個字符。
precision屬性和scale屬性表示精度,當字段類型為double時,precision表示數(shù)值的總長度,scale表示小數(shù)點所占的位數(shù)。
@UpdateTimestamp - 更新時自動更新時間
@CreationTimestamp - 創(chuàng)建時自動更新時間
@Version - 版本號,更新時自動加1
結束語本章內(nèi)容記錄了數(shù)據(jù)庫實體類的簡單的實現(xiàn)方式,并通過application.properties配置JPA的數(shù)據(jù)庫配置項,使得程序運行后能自動關聯(lián)并操作數(shù)據(jù)庫表。
下一章將介紹對數(shù)據(jù)庫的增刪改查(CRUD)操作相關內(nèi)容,請繼續(xù)關注。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/77667.html
摘要:結束語本章預先提供了項目實際效果圖以及項目的整體結構設計,后續(xù)文章會根據(jù)本篇章設計依次實現(xiàn)各個模塊,請持續(xù)關注。 文章系列 【從零入門系列】Sprint Boot 之 Hello World 設計效果圖 頁面展示showImg(https://raw.githubusercontent.com/arbboter/resource/master/segmentfault/image/...
摘要:編寫測試用例代碼打開框架自動生成的測試代碼文件編寫測試用例,測試增刪改查效果,測試代碼如下注釋,它可以對類成員變量方法及構造函數(shù)進行標注,完成自動裝配的工作。 文章系列 【從零入門系列-0】Sprint Boot 之 Hello World 【從零入門系列-1】Sprint Boot 之 程序結構設計說明 【從零入門系列-2】Sprint Boot 之 數(shù)據(jù)庫實體類 前言 前一章...
摘要:結束語非常智能化,為開發(fā)者提供大量的默認配置細節(jié),因此在的幫助下可以快速完成項目的運行,極簡入門繼續(xù)看從零入門系列程序結構設計說明 環(huán)境準備 java 開發(fā)環(huán)境 JDK1.8 安裝 Maven 安裝,jar自動依賴及包管理工具 IDE編輯器:IntelliJ IDEA 2019 說明 本項目為從零入門示例,目標為構建一個書籍增刪改查管理頁,力爭記錄一個無java基礎的程序員學習筆...
閱讀 3638·2023-04-25 14:20
閱讀 1280·2021-09-10 10:51
閱讀 1205·2019-08-30 15:53
閱讀 511·2019-08-30 15:43
閱讀 2373·2019-08-30 14:13
閱讀 2848·2019-08-30 12:45
閱讀 1259·2019-08-29 16:18
閱讀 1228·2019-08-29 16:12