很多开发者用的 MySql逆向工程应该都是框架自带的(MyBatis),但他的效果可能达不到我们想要的效果,然后生成完代码之后,又要手动去去修修改改,甚是麻烦。
这边说明下,我做的这个MySql逆向工程,仅有以下依赖,他是一个单独的模板。
mysql-connector-java
mysql 连接。fastjson
数据库查询的数据,转换成Java类型。lombok
懒得写 get/set。生成的Java实体类有什么功能?
Lombok
注解,需要开启。如果没有开启,则生成 get/set/toString。Javax
注解,需要开启。@Entity,@Table,@Id,@GeneratedValue,@Column。Swagger
注解,需要开启。@ApiModel,ApiModelProperty。set
链式,需要开启。单表
,多表
,全表
生成实体类。源码下载地址 MySql 逆向工程.zip
如何使用?
使用的话,非常简单,只需要少量的代码,加上一些配置,就可以了。so easy
public static void main(String[] args) {
// 生成实体类的配置
EntityConfig entityConfig = EntityConfig.builder()
// 必选
.path("F:/liuqi-project-framework-boot/jar/mysql-generation-tool/src/main/java/com/liuqi/test/entity")
.packageName("com.liuqi.test.entity") // 指定包名 可不填写 会自动识别 (可选)
.prefix("my") // 实体类前缀 默认 "" (可选)
.suffix("entity") // 实体类后缀 默认 "" (可选)
.excludePrefix("t_") // 排除 数据表前缀 默认 "" (可选)
.excludeSuffix("_tb") // 排除数据表后缀 默认 "" (可选)
.enableJavax(true) // 启用 Javax 注解 默认 false (可选)
.enableLombok(true) // 启用 Lombok 注解 默认 false (可选)
.enableSwagger(true) // 启用 Swagger 注解 默认 false (可选)
.enableSetChain(true) // 启用 set 链式功能 默认 false (可选)
// (可选的) 数据表 配置拓展 指定包名 user 所在包名是 packageName + u.s.e
.appendTablePackage(new EntityConfig.TableExtend(
"t_user_tb", // 数据表名称
"u.s.e", // 指定包名 com.liuqi.test.entity.u.s.e
"is_") // 排除字段的前缀 比如字段是 is_del 那么实体类字段是 del
)
// 这是可以多选的
.appendTablePackage(new EntityConfig.TableExtend(
"employee", // 数据表名称
"emp", // 指定包名 com.liuqi.test.entity.emp
"is_") // 排除字段的前缀 比如字段是 is_del 那么实体类字段是 del
)
.build();
// MySql 逆向生成代码的配置
MySqlGenerateConfig generateConfig = MySqlGenerateConfig.builder()
.url("jdbc:mysql://127.0.0.1:3306/test?useSSL=true") // MySql 连接地址
.username("root") // 数据库用户名
.password("123456") // 数据库密码
.tableSchema("test") // 指定库
.tableNames("*") // 指定生成的表 (多个表用英文逗号隔开) (* 号表示全部的表)
.entityInfo(entityConfig) // 生成实体类的配置
.build();
// 创建 MySql生成代码处理器
MySqlGenerated mySqlGenerated = new MySqlGenerated(generateConfig);
// 生成代码
mySqlGenerated.generate();
}
生成的实体类:
package com.liuqi.test.entity.u.s.e;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Setter
@Getter
@ToString
@Accessors(chain = true)
@ApiModel(value = "用户表")
@Entity
@Table(name = "t_user_tb")
public class MyUserEntity implements Serializable {
private static final long serialVersionUID = 6240958744060737969L;
@ApiModelProperty(value = "用户id 自增", example = "1")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "`user_id`", nullable = false)
private Long userId;
@ApiModelProperty(value = "用户名")
@Column(name = "`username`", unique = true, nullable = false, length = 20)
private String username;
@ApiModelProperty(value = "用户昵称")
@Column(name = "`nickname`", length = 22)
private String nickname;
@ApiModelProperty(value = "年龄", example = "1")
@Column(name = "`age`")
private Integer age;
@ApiModelProperty(value = "性别")
@Column(name = "`sex`", length = 1)
private String sex;
@ApiModelProperty(value = "手机号")
@Column(name = "`phone`", unique = true, nullable = false, length = 11)
private String phone;
@ApiModelProperty(value = "是否删除")
@Column(name = "`is_del`")
private Boolean del;
@ApiModelProperty(value = "注册时间")
@Column(name = "`create_time`")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@Column(name = "`update_time`")
private Date updateTime;
}
设计与实现思路:
1:查询数据表信息:
SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'user'
2:查询数据表的所有字段信息:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'user'
以上两条Sql就是查询数据表信息,字段信息。如果不懂可自行百度查阅。
源代码项目结构:代码非常少,也非常简单。
EntityConfig
生成实体类的配置项。MySqlGenerateConfig
mysql 逆向工程的配置项。handle
GenerateEntityCodeHandler
生成实体类代码的处理器,实现了MySqlTableGenerateCodeHandler
接口。MySqlTableGenerateCodeHandler
为数据表生成代码的处理器接口,如果需要生成其他的Java代码(Mapper/Dao/Service)可实现该接口进行拓展。info
ColumnInfo
数据表栏目(字段)的描述信息。TableInfo
数据表的描述信息。util
FileUtil
写Java文件,写入Java代码。MySqlUtil
获取MySql连接,查询 数据表/数据表字段 的信息。StringUtil
下划线转驼峰,首字母大写。TypeConverterUtil
mysql数据类型 转换成 Java数据类型。MySqlGenerated
MySql逆向生成代码的执行器,提供一个 generate()
方法生成代码。
也提供了一个addMySqlTableGenerateCodeHandler
方法,对生生成代码进行拓展。
该逆向生成代码的项目,仅支持MySql数据库,版本在5.7上开发,目前只能生成实体类。
如果需要生成 Mapper接口,Mapper.xml文件,或者 Dao接口呢?
可以实现MySqlTableGenerateCodeHandler
接口,进行拓展。
在生成代码前,添加一个自定义的代码生成器。
源码下载地址 MySql 逆向工程.zip
mysql-generation-tool
源码,可直接导入 IDEA。TestMsqlGenerate.java
测试案例。