前言
由于在項目中使用到了Spring Data JPA(Java Persistent API)進行項目開發(fā),并且自己對JPA比較感興趣想進行學(xué)習(xí)和了解。首先學(xué)習(xí)和了解的是JPA自動創(chuàng)建數(shù)據(jù)庫表,通過JPA能夠讓軟件工程師們不用再去手動創(chuàng)建數(shù)據(jù)表,能夠減輕軟件工程師們的工作量。
通過本篇博客可以實現(xiàn)使用Spring Data JPA自動創(chuàng)建數(shù)據(jù)庫表,并且可以使表與表之間具有關(guān)聯(lián)性(一對多,多對多,一對一)最后可以通過可視化工具Navicat進行表關(guān)系的查看。
Spring Data JPA demo
實現(xiàn)的demo,可以進行下載參考
Spring Data JPA Demo
實現(xiàn)步驟
目前的程序環(huán)境是spring boot項目,JDK8.0,MySQL Connector / J 8.0(8.0版本支持java8及其以上的版本,支持5.6、5.7、8.0版本的mysql數(shù)據(jù)庫,支持4.2版本的jdbc)
導(dǎo)入依賴
在spring boot項目中導(dǎo)入JPA依賴和mysql依賴
<!--jpa 啟動器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql連接器-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
創(chuàng)建實體類
目前有兩個實體類,一個基礎(chǔ)類
兩個實體類分別是UserEntity用戶實體類和ClassEntity班級實體類,他們之間具有一對多的關(guān)系,一個用戶對應(yīng)著一個班級,一個班級可以有多個用戶。
BaseEntity
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.util.Date;
/**
* @author : [WangWei]
* @version : [v1.0]
* @className : BaseEntity
* @description : [基礎(chǔ)類]
* @createTime : [2022/11/18 15:32]
* @updateUser : [WangWei]
* @updateTime : [2022/11/18 15:32]
* @updateRemark : [描述說明本次修改內(nèi)容]
*/
//@MappedSuperclass的類將不是一個完整的實體類,他將不會映射到數(shù)據(jù)庫表,但是他的屬性都將映射到其子類的數(shù)據(jù)庫字段中。
@MappedSuperclass
public class BaseEntity {
//定義字段以及字段的類型和長度和是否允許為null
@Column(name = "create_by",columnDefinition = "varchar(32) COMMENT '創(chuàng)建人'",nullable = false)
private String createdBy;
@Column(name = "created_id",columnDefinition = "varchar(32) COMMENT '創(chuàng)建人id'",nullable = false)
private Long createdId;
@Column(name = "create_time",nullable = false,columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間'")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Column(name = "updated_by",columnDefinition = "varchar(32) COMMENT '更新人'")
private String updateBy;
@Column(name = "updated_id",columnDefinition = "varchar(32) COMMENT '更新人id'")
private Long updateId;
定義字段以及字段的類型并默認為當前時間,并當進行修改的時候更新時間為當前實現(xiàn)
@Column(name = "update_time",columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間'")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@Column(name = "is_delete",columnDefinition = "tinyint(1) COMMENT '是否刪除(0/1 未刪除/刪除)'")
private int isDelete=0;
@Column(name = "remark",columnDefinition = "varchar(64) COMMENT '備注'")
private String remark;
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Long getCreatedId() {
return createdId;
}
public void setCreatedId(Long createdId) {
this.createdId = createdId;
}
public Long getUpdateId() {
return updateId;
}
public void setUpdateId(Long updateId) {
this.updateId = updateId;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public int getIsDelete() {
return isDelete;
}
public void setIsDelete(int isDelete) {
this.isDelete = isDelete;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
UserEntity
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author : [WangWei]
* @version : [v1.0]
* @className : UserEntity
* @description : [用戶實體類]
* @createTime : [2022/11/18 14:57]
* @updateUser : [WangWei]
* @updateTime : [2022/11/18 14:57]
* @updateRemark : [描述說明本次修改內(nèi)容]
*/
@Entity //聲明類為實體類
@Table(name="jpa_user")//對應(yīng)創(chuàng)建之后的表名
public class UserEntity extends BaseEntity{
@Id
@Column(name = "user_code",columnDefinition = "bigint(20) COMMENT '學(xué)號'",nullable = false)//定義字段名和類型以及長度和備注,和是否允許為null
private Long id;
@Column(name="user_Name",nullable = false,columnDefinition = "varchar(32) COMMENT '用戶名'")
private String userName;
@Column(name="pass_word",nullable = false,columnDefinition = "varchar(32) COMMENT '密碼'")
private String password;
@Column(name="phone_Number",nullable = false,columnDefinition = "varchar(16) COMMENT '手機號'")
private String phoneNumber;
@Column(name="sex",columnDefinition = "varchar(2) COMMENT '性別'")
private String sex;
@Column(name="birthday",nullable = false,columnDefinition = "datetime COMMENT '生日日期'")
@DateTimeFormat(pattern = "yyyy-MM-dd ")
private Date birthday;
//定義與ClassEntity之間的關(guān)聯(lián)關(guān)系為一對多
//cascade:該屬性定義類和類之間的級聯(lián)關(guān)系,cascade 的值只能從 CascadeType.PERSIST (級聯(lián)新建)、 CascadeType.REMOVE (級聯(lián)刪除)、 CascadeType.REFRESH (級聯(lián)刷新)、 CascadeType.MERGE (級聯(lián)更新)中選擇一個或多個。還有一個選擇是使用 CascadeType.ALL ,表示選擇全部四項。
@OneToMany(cascade = CascadeType.ALL)
//在保存關(guān)系中的表中,所保存關(guān)聯(lián)的外鍵字段
@JoinColumn(name="user_code")
private List<ClassEntity>classEntities=new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<ClassEntity> getClassEntities() {
return classEntities;
}
public void setClassEntities(List<ClassEntity> classEntities) {
this.classEntities = classEntities;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
ClassEntity
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author : [WangWei]
* @version : [v1.0]
* @className : ClassEntity
* @description : [班級實體]
* @createTime : [2022/11/18 15:47]
* @updateUser : [WangWei]
* @updateTime : [2022/11/18 15:47]
* @updateRemark : [描述說明本次修改內(nèi)容]
*/
@Entity
//指定創(chuàng)建之后的表名和創(chuàng)建索引
@Table(name = "jpa_class",
indexes = {@Index(name = "index_class_name",columnList = "class_name")}
)
//添加表的注釋
@org.hibernate.annotations.Table(appliesTo = "jpa_class",comment = "班級表")
public class ClassEntity extends BaseEntity{
@Id
@Column(name = "class_id",columnDefinition = "bigint(20) COMMENT '學(xué)號'",nullable = false)
private Long id;
@Column(name ="class_name",nullable = false,columnDefinition = "varchar(32) COMMENT '班級名'")
private String className;
@Column(name="address",nullable = false,columnDefinition = "varchar(128) COMMENT '班級地址'")
private String address;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
編輯application.yml文件配置數(shù)據(jù)庫連接和jpa配置
spring:
datasource:
#mysq 驅(qū)動
driver-class-name: com.mysql.cj.jdbc.Driver
#連接數(shù)據(jù)庫的url中配置ip和數(shù)據(jù)庫名稱以及時區(qū)
url: jdbc:mysql://localhost:3306/spring_jpa?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: root
password: root
jpa:
hibernate:
#更新或者創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)
ddl-auto: update
#控制臺顯示SQL
show-sql: true
運行測試
完整的目錄結(jié)構(gòu):
1.運行程序
出現(xiàn)以下界面,表示運行成功
2.在Navicat中查看已創(chuàng)建成功的表
查看相應(yīng)的表結(jié)構(gòu)和建表語句
3.查看表之間的關(guān)系文章來源:http://www.zghlxwxcb.cn/news/detail-446957.html
總結(jié)
目前博主只是初步進行了實現(xiàn),像在項目中進行實際運用還有大量需要學(xué)習(xí)和掌握的知識,特別是處理表與表之間的關(guān)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-446957.html
如果博主的文章對您有所幫助,可以評論、點贊、收藏,支持一下博主!!!
到了這里,關(guān)于Spring Data JPA之自動創(chuàng)建數(shù)據(jù)庫表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!