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

案例场景由于刷库没有没有及时备份新增的几个数据库表。但是当时已经使用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表示小数点所占的位数

nameString列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。
uniqueboolean列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。
nullableboolean列的值是否允许为 null。默认为 true。
insertableboolean列是否包含在 INSERT 语句中,默认为 true。
updatableboolean列是否包含在 UPDATE 语句中,默认为 true。
columnDefinitionString生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。
tableString当前列所属的表的名称。
lengthint列的长度,仅对字符串类型的列生效。默认为255。
precisionint列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。
scaleint列的精度,仅对十进制数值有效,表示小数位的总位数。默认为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

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

更多推荐