最近工作中用到关于实体类生成数据表的一种方式。

案例场景由于刷库没有没有及时备份新增的几个数据库表。但是当时已经使用Idea插件逆向生成过实体表的DO类了。那么怎么给它在逆向回去生成表呢?

接下来我带着大家一起使用一下JPA的注解方式去逆向生成表类似于hibernate自动创建表的方式了。

首先照顾第一次接触的小白,我们在项目中先引入POM 依赖

我用的spirngboot 的<version>2.2.5.RELEASE</version>  版本可以不限制

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.5.RELEASE</version> 
        </dependency>
<!--        mysql 连接使用到的依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
              <version>8.0.23</version>
        </dependency>
<!--        druid 连接池依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
<!--        jpa 依赖 -->
        <!--        逆向生成表-->
        <!-- Spring Data Jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.2.5.RELEASE</version> 
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
package EntryToMysqlTabel;
import lombok.*;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 规格信息 DO
 *
 * @author admin
 */
@Table(name = "op_spec_info")
@Data
@Entity
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestDO{

    /**
     * id
     */
    @Id
    private Long id;
    /**
     * 规格描述
     */
    @Column(name = "spec_desc",columnDefinition ="varchar(50) COMMENT '规格描述'")
    private String specDesc;
    /**
     * 规格编码
     */
    @Column(name = "spec_code",columnDefinition ="varchar(50) COMMENT '规格编码'")
    private String specCode;
    /**
     * 创建人
     */
    @Column(name = "creater", columnDefinition ="varchar(50) COMMENT '创建人'")
    private String creater;

}

 在这里奉上学习过程中使用到的相关资料:

补充:

 

当前块属于二次编辑内容补充几点(望见谅):

@Entity:告诉JPA这是一个实体类(和数据表映射的类)

@Table:指定和哪个数据表对应;如果省略默认表名就是user;

③@Id:告诉JPA这个字段是数据表的主键

④@GeneratedValue:告诉JPA这个字段的生成规则;

  GenerationType.AUTO--主键由程序控制

  GenerationType.TABLE--使用一个特定的数据库表格来保存主键

  GenerationType.SEQUENCE--根据底层数据库的序列来生成主键,条件是数据库支持序列

  GenerationType.IDENTITY--自增

@Column:设置字段属性

  name:设置该字段在数据库表中的名称

  unique:唯一标识,默认false

  nullable:是否可以为空为空,默认true

  insertable:插入数据时,是否需要插入该字段

  updatable:更新数据时,是否需要更新该字段

  columnDefinition:该字段创建的SQL语句,一般用于通过Entity生成表定义时使用;常用于说明数据库字段的注释

  table:表示当映射多个表时,指定表的表中的字段,默认值为主表的表名

  length:字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符

  precision和scale:表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数

name String 列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。
unique boolean 列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。
nullable boolean 列的值是否允许为 null。默认为 true。
insertable boolean 列是否包含在 INSERT 语句中,默认为 true。
updatable boolean 列是否包含在 UPDATE 语句中,默认为 true。
columnDefinition String 生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。
table String 当前列所属的表的名称。
length int 列的长度,仅对字符串类型的列生效。默认为255。
precision int 列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。
scale int 列的精度,仅对十进制数值有效,表示小数位的总位数。默认为0。

上边是一个实体类各个数据表需要的字段加上@Column 注解。 标识一个mysql字段

关于字段的主要使用方式:

@Column 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值

然后开始配置application.yml 文件    

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://你的IP:你的端口号/你的数据库?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&autoReconnect=true&maxReconnects=3 # MySQL Connector/J 8.X 连接的示例
    username: 你的账号
    password: 你的密码
    druid:
      max-active: 20 #最大活跃数
      initial-size: 5 #初始化数量
      min-idle: 5 #最小活跃数
      max-wait: 60000 #配置超时等待时间
      time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
      validation-query: SELECT 1 FROM
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true #打开PSCache,并且指定每个连接上PSCache的大小
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat,wall,log4j2 #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #通过connectProperties属性来打开mergeSql功能;慢SQL记录
      use-global-data-source-stat: true
  jpa:
    show-sql: true  #控制台显示SQL
    database: mysql  # 根据你的来
    hibernate:
      ddl-auto: update  #更新或者创建数据表结构
    open-in-view: false

测试:

启动springboot 后 jpa就会根据你的实体映射的表进行调整没有的话会触发create

注意 : 

@Column  columnDefinition 这个字段值正常是字段类型设置 不应该加Comment  为了在生成的时候生成注释需要可以临时使用这种方式。 


打开数据库查看 效果

对应的实体映射 

注意以下问题疏忽的地方
一定要进行实体扫描 


@entry 注解要被spring 扫描到
启动类上一定要加上
@EntityScan("xx.jpa.entry")  //这里是你的实体类路径


 

大功告成啦。

快试试吧!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。