最近工作中用到关于实体类生成数据表的一种方式。
案例场景由于刷库没有没有及时备份新增的几个数据库表。但是当时已经使用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") //这里是你的实体类路径
大功告成啦。
快试试吧!