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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Data JPA之自动创建数据库表

Spring Data 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

运行测试

完整的目录结构:

1.运行程序

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


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


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







3.查看表之间的关系




总结

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

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
1天前
|
监控 Oracle 关系型数据库
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
43 8
|
1天前
|
SQL 安全 数据管理
在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
【2月更文挑战第33天】在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
51 7
|
1天前
|
SQL 监控 druid
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
241 0
|
1天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
|
1天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
1天前
|
存储 安全 Java
Spring Security实现基于数据库实现认证
本文档介绍了如何在Spring Security框架中基于数据库实现用户认证。首先,Spring Security提供了一个`UserDetailsService`接口,用于获取用户详细信息,通常在用户尝试登录时被调用。
51 5
|
1天前
|
Java 数据库 Spring
如何使用Spring Data JPA完成审计功能
如何使用Spring Data JPA完成审计功能
|
1天前
|
关系型数据库 MySQL 数据库
MySQL技能完整学习列表——1、数据库基础概念——2、数据库管理系统(DBMS)——3、数据模型(Data Model)
MySQL技能完整学习列表——1、数据库基础概念——2、数据库管理系统(DBMS)——3、数据模型(Data Model)
28 0
|
1天前
|
Java 数据库连接 API
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
Spring Boot整合Spring Data JPA进行CRUD和模糊查询
42 0