Spring Data JPA之自动创建数据库表
前言
由于在项目中使用到了Spring Data JPA(Java Persistent API)进行项目开发,并且自己对JPA比较感兴趣想进行学习和了解。首先学习和了解的是JPA自动创建数据库表,通过JPA能够让软件工程师们不用再去手动创建数据表,能够减轻软件工程师们的工作量。
通过本篇博客可以实现使用Spring Data JPA自动创建数据库表,并且可以使表与表之间具有关联性(一对多,多对多,一对一)最后可以通过可视化工具Navicat进行表关系的查看。
Spring Data JPA demo
实现的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
运行测试
完整的目录结构:
1.运行程序
出现以下界面,表示运行成功
2.在Navicat中查看已创建成功的表
查看相应的表结构和建表语句
3.查看表之间的关系
总结
目前博主只是初步进行了实现,像在项目中进行实际运用还有大量需要学习和掌握的知识,特别是处理表与表之间的关系。