Spring Data JPA之自动创建数据库表

  • ​​前言​​
  • ​​Spring Data JPA demo​​
  • ​​实现步骤​​
  • ​​导入依赖​​
  • ​​创建实体类​​
  • ​​编辑application.yml文件配置数据库连接和jpa配置​​
  • ​​运行测试​​
  • ​​总结​​
  • ​​如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!​​

前言

由于在项目中使用到了Spring Data JPA(Java Persistent API)进行项目开发,并且自己对JPA比较感兴趣想进行学习和了解。首先学习和了解的是JPA自动创建数据库表,通过JPA能够让软件工程师们不用再去手动创建数据表,能够减轻软件工程师们的工作量。
通过本篇博客可以实现使用Spring Data JPA自动创建数据库表,并且可以使表与表之间具有关联性(一对多,多对多,一对一)最后可以通过可视化工具Navicat进行表关系的查看。

Spring Data JPA demo

实现的demo,可以进行下载参考
​Spring Data JPA Demo​​

实现步骤

目前的程序环境是spring boot项目,JDK8.0,MySQL Connector / J 8.0(8.0版本支持java8及其以上的版本,支持5.6、5.7、8.0版本的mysql数据库,支持4.2版本的jdbc)

导入依赖

在spring boot项目中导入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>

创建实体类

目前有两个实体类,一个基础类
两个实体类分别是UserEntity用户实体类和ClassEntity班级实体类,他们之间具有一对多的关系,一个用户对应着一个班级,一个班级可以有多个用户。

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 : [基础类]
* @createTime : [2022/11/18 15:32]
* @updateUser : [WangWei]
* @updateTime : [2022/11/18 15:32]
* @updateRemark : [描述说明本次修改内容]
*/
//@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。
@MappedSuperclass

public class BaseEntity {


//定义字段以及字段的类型和长度和是否允许为null
@Column(name = "create_by",columnDefinition = "varchar(32) COMMENT '创建人'",nullable = false)
private String createdBy;

@Column(name = "created_id",columnDefinition = "varchar(32) COMMENT '创建人id'",nullable = false)
private Long createdId;



@Column(name = "create_time",nullable = false,columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'")
@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;

定义字段以及字段的类型并默认为当前时间,并当进行修改的时候更新时间为当前实现
@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 : [描述说明本次修改内容]
*/
@Entity //声明类为实体类
@Table(name="jpa_user")//对应创建之后的表名
public class UserEntity extends BaseEntity{
@Id
@Column(name = "user_code",columnDefinition = "bigint(20) COMMENT '学号'",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之间的关联关系为一对多
//cascade:该属性定义类和类之间的级联关系,cascade 的值只能从 CascadeType.PERSIST (级联新建)、 CascadeType.REMOVE (级联删除)、 CascadeType.REFRESH (级联刷新)、 CascadeType.MERGE (级联更新)中选择一个或多个。还有一个选择是使用 CascadeType.ALL ,表示选择全部四项。

@OneToMany(cascade = CascadeType.ALL)
//在保存关系中的表中,所保存关联的外键字段
@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 : [描述说明本次修改内容]
*/
@Entity
//指定创建之后的表名和创建索引
@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 '学号'",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文件配置数据库连接和jpa配置

spring:
datasource:
#mysq 驱动
driver-class-name: com.mysql.cj.jdbc.Driver
#连接数据库的url中配置ip和数据库名称以及时区
url: jdbc:mysql://localhost:3306/spring_jpa?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: root
password: root
jpa:
hibernate:
#更新或者创建数据库表结构
ddl-auto: update
#控制台显示SQL
show-sql: true

运行测试

完整的目录结构:

Spring Data JPA之自动创建数据库表_实体类


1.运行程序

出现以下界面,表示运行成功

Spring Data JPA之自动创建数据库表_数据库_02


2.在Navicat中查看已创建成功的表

Spring Data JPA之自动创建数据库表_数据库_03


查看相应的表结构和建表语句

Spring Data JPA之自动创建数据库表_java_04


Spring Data JPA之自动创建数据库表_数据库_05

Spring Data JPA之自动创建数据库表_spring_06


Spring Data JPA之自动创建数据库表_java_07

3.查看表之间的关系

Spring Data JPA之自动创建数据库表_spring_08


Spring Data JPA之自动创建数据库表_实体类_09

总结

目前博主只是初步进行了实现,像在项目中进行实际运用还有大量需要学习和掌握的知识,特别是处理表与表之间的关系。

如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!