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

运行测试

完整的目录结构:
Spring Data JPA之自动创建数据库表
1.运行程序
出现以下界面,表示运行成功
Spring Data JPA之自动创建数据库表
2.在Navicat中查看已创建成功的表
Spring Data JPA之自动创建数据库表
查看相应的表结构和建表语句
Spring Data JPA之自动创建数据库表
Spring Data JPA之自动创建数据库表

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

3.查看表之间的关系
Spring Data JPA之自动创建数据库表
Spring Data JPA之自动创建数据库表

总结

目前博主只是初步进行了实现,像在项目中进行实际运用还有大量需要学习和掌握的知识,特别是处理表与表之间的关系。文章来源地址https://www.toymoban.com/news/detail-446957.html

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

到了这里,关于Spring Data JPA之自动创建数据库表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用Spring Data JPA实现审计功能,记录创建人、创建时间、最后修改时间和最后修改人

    近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。 本项目为前后端分离开发,后端基于 Java21 和 SpringBoot3 开发,后端使用 Spring Security 、 JWT 、 Spr

    2024年01月19日
    浏览(7)
  • Spring Data Elasticsearch - 在Spring应用中操作Elasticsearch数据库

    Spring Data Elasticsearch为文档的存储,查询,排序和统计提供了一个高度抽象的模板。使用Spring Data ElasticSearch来操作Elasticsearch,可以较大程度的减少我们的代码量,提高我们的开发效率。 要使用Elasticsearch我们需要引入如下依赖: 还需要在配置文件中增加如下配置 类比于MyBat

    2024年02月14日
    浏览(7)
  • 如何使用Spring Data JPA简化MySQL数据访问

    本篇文章是 “一起学习mysql” 系列的第五篇文章,本篇文章我们学习一下Spring Data JPA的使用,在开始学习器,我们先来了解一下什么是JPA。 JPA的全称是Java Persistence API,是J2EE中的一条规范,它标准化了数据持久化API。在上一篇文章中,我们了解了如何使用MyBatis进行MySQL数据

    2024年02月15日
    浏览(8)
  • 69、Spring Data JPA 的 @Query查询 和 命名查询(半自动:提供 SQL 或 JPQL 查询)

    69、Spring Data JPA 的 @Query查询 和 命名查询(半自动:提供 SQL 或 JPQL 查询)

    1、方法名查询(全自动,既不需要提供sql语句,也不需要提供方法体) 2、@Query查询(半自动:提供 SQL 或 JPQL 查询) 3、自定义查询(全手动) @Query查询 和 命名查询的区别: 命名查询与直接用@Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。

    2024年02月07日
    浏览(5)
  • 图数据库Neo4j学习四——Spring Data NEO

    图数据库Neo4j学习四——Spring Data NEO

    如下所示,这是我们的一个实际的节点,我们以该节点为例,创建一个UserNode 如果出现以下错误 解决方法 :找到你安装neo4j的路径下的conf文件夹,neo4j.conf,找到 将前面的注释#去掉,然后重启neo4j,在重启项目即可。 通过接口创建User节点,老王 ,然后再neo4j中查询,看能否

    2024年02月13日
    浏览(25)
  • 图数据库Neo4j学习四Spring Data NEO

    图数据库Neo4j学习四Spring Data NEO

    如下所示,这是我们的一个实际的节点,我们以该节点为例,创建一个UserNode 如果出现以下错误 解决方法 :找到你安装neo4j的路径下的conf文件夹,neo4j.conf,找到 将前面的注释#去掉,然后重启neo4j,在重启项目即可。 通过接口创建User节点,老王 ,然后再neo4j中查询,看能否

    2024年02月11日
    浏览(19)
  • 图数据库_Neo4j和SpringBoot Data整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

    2023-09-10 10:37:48 补充 注意:下面是旧版本的语法,如果你发现@NodeEntity这样的注解没有的话可以这样: 这里就要用@Node 另外如果@StartNode和@EndNode都没有了,那么说明是用法变了. 关于最新的用法,在官网有明确的说明和案例,很有用: 下面给出官网的案例:

    2024年02月09日
    浏览(21)
  • Spring Data JPA简化数据访问,提升开发效率和程序可维护性

    Java Persistence API(JPA)是一种Java EE的ORM规范用于与关系型数据库进行交互。它提供了Java对象模型和关系型数据库之间的映射。JPA为开发者提供了一种面向对象的方式来访问数据库,同时也减少了应用程序与底层数据库之间的重复代码。 Spring Data JPA是基于JPA规范的一个Spring

    2024年02月05日
    浏览(12)
  • SpringBoot工程启动时自动创建数据库、数据表

    针对Java工程启动时自动创建数据库、数据表的需求 对 java、springmvc工程,我们需要自己动手去实现创建数据表、表数据,具体请移步参阅:JAVA工程启动时自动创建数据库、数据表 下面我们来探讨在Springboot下怎么去实现 我们知道,springboot工程配置数据源一般采用yaml或prope

    2024年02月02日
    浏览(33)
  • spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)

    :mysql 达梦/dameng jpa 多数据源 spring boot:2.1.17.RELEASE mysql驱动:8.0.21(跟随boot版本) 达梦驱动:8.1.2.192 lombok:1.18.12(跟随boot版本) 以mysql为主数据源,达梦为第二数据源方式配置 适用于旧项目二次开发接入达梦数据库或基于通用二方/三方包做业务扩展等场景 将以不

    2024年02月05日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包