基于DDL生成java对象属性及描述
前言
你是否有这样的经历?
----每次新增表,然后要写个对应的model,每次都是手写属性,感觉很烦(因为数据库属性要求蛇形,java对象要求驼峰)。
那么看看这个吧,简单实用。如果有现成的插件,欢迎大牛们指点。
基于DDL生成java对象属性
先看下Navicat生成的DDL,我们需要用到的是大红框内的部分。大佬们也可以自己再扩展下(支持全部粘过去,然后去掉头,去掉尾巴再解析)
1.来个简单的demo
这里创建的类名是:Snake2Camel2
FILE_PATH:文件存放的路径
SnakeFile文件是这样的:
`brrow_amt` decimal(18,2) DEFAULT '0.00' COMMENT '借阅收入',
输出结果是这个样子的:
/**
* 外借表id
**/
private Long id;
转换代码是如下:
@Slf4j
public class Snake2Camel2 {
private static String FILE_PATH = "E:/1.IDEA/Workspace/spring-boot-hello/src/main/java/com/example/demo/";
public static void main(String[] args) {
//读取文件
try {
FileReader fr = new FileReader(FILE_PATH + "SnakeFile");
BufferedReader bf = new BufferedReader(fr);
String str;
// 按行读取字符串
while ((str = bf.readLine()) != null) {
//去调前置空格
str = str.trim();
// log.info("--" + str);
//获取属性名-蛇形转驼峰
String str1 = getNewString(str.substring(str.indexOf('`') + 1, str.lastIndexOf('`')));
// log.info("str1 = " + str1);
//获取属性类型
String[] strs = str.split(" ");
// log.info("转换前:{}", strs[1]);
if (strs[1].contains("(")) {
strs[1] = strs[1].substring(0, strs[1].indexOf('('));
}
String str2 = getDataType(strs[1]);
// log.info("str2 = " + str2);
//获取对应属性注释
String s = str.substring(0,str.lastIndexOf('\''));
String str3 = s.substring(s.lastIndexOf('\'')+1);
// log.info("str3 = " + str3);
//生成属性
getMessage(str1, str2, str3);
}
bf.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
//
}
public static void getMessage(String str1, String str2, String str3) {
System.out.println("/**");
System.out.println(" * " + str3);
System.out.println(" **/");
System.out.println("private " + str2 + " " + str1+";");
}
/**
* @Author longtao
* @Date 2020/9/4
* @Describe 蛇型转驼峰
**/
public static String getNewString(String str) {
str = str.toLowerCase();
int index = str.indexOf("_");
while (index != -1) {
str = str.replaceFirst(str.substring(index, index + 2), str.substring(index + 1, index + 2).toUpperCase());
index = str.indexOf("_");
}
return str;
}
public static String getDataType(String str) {
switch (str) {
//默认放到default里面
// case "varchar":
// return "String";
case "bigint":
return "Long";
case "decimal":
return "BigDecimal";
case "timestamp":
case "date":
return "Date";
case "double":
return "Double";
case "float":
return "Float";
case "int":
return "Integer";
default:
return "String";
}
}
}
2.不用DDL,直接解析 xxx属性名
在看个简单的,如果拿到了EXCEL形式的数据库设计,那么也可以直接copy整列到SnakeFile文件中
这里创建的类名是:Snake2Camel
FILE_PATH:文件存放的路径
SnakeFile文件是这样的:
id bigint(20) 外借表id
输出结果是这个样子的:
/**
* 外借表id
**/
private Long id;
转换代码如下:
@Slf4j
public class Snake2Camel {
private static String FILE_PATH = "E:/1.IDEA/Workspace/spring-boot-hello/src/main/java/com/example/demo/";
private static String REGEX = "\\w*";
public static void main(String[] args) {
//读取文件
try {
FileReader fr = new FileReader(FILE_PATH + "SnakeFile");
BufferedReader bf = new BufferedReader(fr);
String str;
// 按行读取字符串
while ((str = bf.readLine()) != null) {
//正则表达式
// Pattern p = Pattern.compile(REGEX);
// Matcher m = p.matcher(str);
// m.find();
//获取属性名
str = str.trim();
String[] strs = str.split(" ");
//获取属性名--蛇形转驼峰
String str1 = getNewString(strs[0]);
//获取数据类型-类型映射
if (strs[1].contains("(")) {
strs[1] = strs[1].substring(0, strs[1].indexOf('('));
}
String str2 = getDataType(strs[1]);
//获取属性注释
String str3 = strs[2];
getMessage(str1,str2,str3);
}
bf.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
//按行转换,并输出控制台
}
/**
* @Author longtao
* @Date 2020/9/4
* @Describe 蛇型转驼峰
**/
public static String getNewString(String str) {
str = str.toLowerCase();
int index = str.indexOf("_");
while (index != -1) {
str = str.replaceFirst(str.substring(index, index + 2), str.substring(index + 1, index + 2).toUpperCase());
index = str.indexOf("_");
}
return str;
}
public static void getMessage(String str1, String str2, String str3) {
System.out.println("/**");
System.out.println(" * " + str3);
System.out.println(" **/");
System.out.println("private " + str2 + " " + str1+";");
}
public static String getDataType(String str) {
switch (str) {
//默认放到default里面
// case "varchar":
// return "String";
case "bigint":
return "Long";
case "decimal":
return "BigDecimal";
case "timestamp":
case "date":
return "Date";
case "double":
return "Double";
case "float":
return "Float";
case "int":
return "Integer";
default:
return "String";
}
}
}
上述两个Demo中,三个字段(属性名,数据类型,描述)缺一不可。毕竟代码没办法区分你中间少了数据类型。所以要使用的话,请保证三个字段都有值。
当然也可以根据实际情况自己优化下,这里提供的也只是我工作中用到的。
感谢观看~~