一.导读
本篇文章分享通过数据库表自动生成Java代码思路方法
二.思路
1.创建数据库表
2.检索出数据库表名和表的列
获取表名:https://www.xiangquba.cn/2020/08/23/mysql_information_schema_tables/
3.数据库与Java映射关系
(1).数据库表名 -》Java类名
1).通常数据库表的命名规则都是前缀_表功能或者直接是表功能,例:
用户表: t_user 前缀 t_ 或定义 user
用户角色表: t_user_role 前缀 t_ 或定义 user_role
2).Java的类名通常都是大写,例:
用户类: Tuser 或者 User
角色类: TUserRole 或者 UserRole
思路分析: 基于以上的规则,我们分析出想要通过数据库表名生成Java类名,首先要检索出数据库表名,然后将前缀去掉,并将表名的第一个首写字母大写,如果表名之间有多个下划线,则将下划线替换掉,并将第一个字母大写,形成驼峰似命名规则。
案例演示:
/***
* @param tableName
* @return
*/
private static String generateHumpClass(String tableName) {
// 生成驼峰并替换掉下划线
return WordUtils.capitalizeFully(tableName, new char[]{'_'}).replace("_", "");
}
/***
* 表名转化成列名
* @param tableName 表名
* @param tablePrefix 表前缀
* @return
*/
private static String tableToJavaClass(String tableName, String tablePrefix) {
if (StringUtils.isNotBlank(tablePrefix)) {
// 替换掉第一次出现的关键字
tableName = tableName.replaceFirst(tablePrefix, "");
}
return generateHumpClass(tableName);
}
public static void main(String[] args) {
System.out.println("tableName -> Java::" + tableToJavaClass("t_user_role", "t_"));
}
(2).数据库表的列名 -》Java属性值
1).数据库表列通常名规则也是下划线’_’或者是功能描述,例:
用户表:User的字段
主键 id 类型 bigint
用户名 username varchar(20)
头像 user_photo_url varchar(50)
创建时间 create_time datetime
期望的Java属性值:
private Long id;
private String userName;
private String userPhotoUrl;
private Date createTime;
思路分析:通过期望的结果来看,生成Java的属性也遵循驼峰命名规则,并且下划线去掉思路跟类名生成一样
案例演示:
SQL:
<select id=”queryColumns” resultType=”map”> select column_name columnName, data_type dataType, column_comment columnComment from information_schema.columns where table_name = #{tableName} </select>
columns为上面SQL检索出来的表的列信息,ColumnEntity为封装的列实体
for (Map<String, String> column : columns) {
ColumnEntity columnEntity = new ColumnEntity();
// 获取表的列名(字段名称)
columnEntity.setColumnName(generateHumpAttr(column.get("columnName")));
// 获取数据类型
columnEntity.setDataType(column.get("dataType"));
// 获取列的描述
columnEntity.setComments(column.get("columnComment"));
}
/***
* 将表列名转换驼峰属性名
* @param columnName
* @return
*/
private static String generateHumpAttr(String columnName) {
// 生成驼峰并替换掉下划线
return WordUtils.uncapitalize(WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", ""));
}
(3).数据库表的数据类型 -》Java属性值类型
获取Java属性值类型:columnEntity.getDataType()
注:这里通过columnEntity.getDataType()只是获得了数据库字段类型,我们还需要在做一层数据库类型与Java字段的映射,这个映射关系可以放在配置文件里,然后用的时候在进行转换。例:
config为配置的key(数据库字段类型)和value(Java类型)
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
String attrType = config.getString(columnEntity.getDataType());
columnEntity.setAttrType(attrType);
(4).数据库表的列描述 -》Java属性值注释
获取Java属性值注释:columnEntity.getComments();
4.组装拼接
上面的流程只是将数据库与Java属性进行了映射,接下来还需要将数据进行拼接, 这里可以用模版引擎或者直接用代码拼接的方式。
代码拼接:
案例伪代码演示:
"priave" + " " + columnEntity.getAttrType() + " " + columnEntity.getColumnName + ";"
模版引擎velocity为例:
package ${package}.${moduleName}.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* ${comments}
*
* @author ${author}
* @date ${datetime}
*/
@Data
@TableName("${tableName}")
@EqualsAndHashCode(callSuper = true)
public class ${className} extends Model<${className}> {
private static final long serialVersionUID = 1L;
#foreach ($column in $columns)
/**
* $column.comments
*/
private $column.attrType $column.columnName;
#end
}
注:这里利用了lambda的@Data属性生成set/get方法
原文链接:通过数据库表自动生成Java代码思路方法,转载请注明来源!