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