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依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><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的类将不是一个完整的实体类,他将不会映射到数据库表,但是他的属性都将映射到其子类的数据库字段中。@MappedSuperclasspublic 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_TIMESTAMPCOMMENT '创建时间'")@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)//定义字段名和类型以及长度和备注,和是否允许为nullprivate 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-8username: rootpassword: rootjpa:hibernate:#更新或者创建数据库表结构ddl-auto: update#控制台显示SQLshow-sql: true

运行测试

完整的目录结构:

1.运行程序
出现以下界面,表示运行成功

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

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


3.查看表之间的关系

总结

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

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。