将Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
一、Navicat右键表【对象信息】-【DDL】样式
CREATE TABLE `test_result` (
`id` varchar(60) NOT NULL COMMENT 'id',
`taskid` varchar(100) DEFAULT NULL COMMENT '任务编号',
`inspection_code` varchar(100) DEFAULT NULL COMMENT '关联操作大类编码',
`inspection_param_code` varchar(100) DEFAULT NULL COMMENT '操作项编码',
`content1` varchar(255) DEFAULT NULL COMMENT '内容1',
`content2` varchar(255) DEFAULT NULL COMMENT '内容2',
`content3` varchar(255) DEFAULT NULL COMMENT '内容3',
`content4` varchar(255) DEFAULT NULL COMMENT '内容4',
`input_val` varchar(1000) DEFAULT NULL COMMENT '输入内容',
`dlt` int(10) DEFAULT '0' COMMENT '逻辑删除',
`insert_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '插入时间',
`last_modify_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '上次修改时间',
`update_time` datetime DEFAULT NULL,
`oper_type` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、JavaBean样式
package com.rhino.common.db;
import org.xutils.db.annotation.Column;
/**
* @author LuoLin
* @since Create on 2019/1/3.
*/
public class BaseEntity {
/**
* 是否可用(0可用,1不可用)
*/
public static final String ENABLED = "enabled";
@Column(name = ENABLED)
public String enabled;
/**
* 最后修改时间
*/
public static final String LAST_MODIFY_TIME = "last_modify_time";
@Column(name = LAST_MODIFY_TIME)
public String last_modify_time;
/**
* 创建时间
*/
public static final String CREATE_TIME = "create_time";
@Column(name = CREATE_TIME)
public String create_time;
}
三、实现原理
通过读文件,获取关键字内容,写入class类中。
四、源码
这里直接贴出源码,源码注释很全面,这里就不赘述了。
package com.rhino.common.db;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import io.reactivex.annotations.NonNull;
/**
* <p>将Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean</p>
*
* @author LuoLin
* @since Create on 2019/1/14.
*/
public class EasyCreateJavaBean {
/**
* 输入配置文件,将Navicat右键表【对象信息】-【DDL】的内容拷贝在该文件中,支持多表操作
*/
public static final String SOURCE_FILE_PATH = "D:\\Workspace\\KSI\\evaluation360-android\\common\\src\\main\\java\\com\\cnksi\\common\\db\\createJavaBean.sql";
/**
* JavaBean输出目录
*/
public static final String OUTPUT_PATH = "D:\\Workspace\\KSI\\evaluation360-android\\login\\src\\main\\java\\com\\cnksi\\evaluation360\\entity";
/**
* JavaBean所在包名
*/
public static final String OUTPUT_FILE_PACKAGE_NAME = "com.cnksi.evaluation360.entity";
/**
* JavaBean的基类包名,可以为空
*/
// public static final String BASE_CLASS_PAKAGE_NAME = "com.cnksi.common.db";
public static final String BASE_CLASS_PAKAGE_NAME = null;
/**
* JavaBean的基类,可以为空
*/
// public static final String BASE_CLASS = "BaseEntity";
public static final String BASE_CLASS = null;
/**
* 用于排除基类已经存在的字段,可以为空
*/
// public static final String[] INVALID_COLUMN_NAME = new String[] {
// "enabled", "last_modify_time", "create_time"
// };
public static final String[] INVALID_COLUMN_NAME = null;
/**
* Main
*/
public static void main(String[] args) {
createJavaBean(SOURCE_FILE_PATH);
}
/**
* Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
*
* @param sqlFilePath 文件路径
*/
public static void createJavaBean(String sqlFilePath) {
String sqlFileContent = readFile(sqlFilePath);
String[] tableContents = sqlFileContent.split("CREATE ");
for (String tableContent : tableContents) {
if (tableContent.isEmpty()) {
continue;
}
String tableName = getTableName(tableContent);
String className = createClassNameByTableName(tableName);
writeFile(OUTPUT_PATH + File.separator + className + ".java", createClassContent(className, tableName, tableContent));
}
}
/**
* 获取表名称
*
* @param tableContent 表内容
* @return 表名称
*/
@NonNull
public static String getTableName(String tableContent) {
int start = tableContent.indexOf("TABLE `") + 7;
int end = tableContent.indexOf("` (");
return tableContent.substring(start, end);
}
/**
* 获取表注释
*
* @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
* @return 表注释
*/
@NonNull
public static String getTableComment(String tableContent) {
String[] lineContent = tableContent.split("\r\n");
int start = lineContent[lineContent.length - 1].indexOf("COMMENT='") + 9;
int end = lineContent[lineContent.length - 1].indexOf("';");
if (start >= 9) {
return lineContent[lineContent.length - 1].substring(start, end);
}
return "";
}
/**
* 获取主键
* @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
* @return 主键
*/
@NonNull
public static String getPrimaryKey(String tableContent) {
String[] lineContent = tableContent.split("\r\n");
for (String line : lineContent) {
if (line.contains("PRIMARY KEY")) {
int start = line.indexOf("PRIMARY KEY (`") + 14;
int end = line.indexOf("`)");
return line.substring(start, end);
}
}
return "";
}
/**
* 创建class文件内容
*
* @param className class名称
* @param tableName 表名称
* @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
* @return class文件内容
*/
@NonNull
public static String createClassContent(String className, String tableName, String tableContent) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("package ").append(OUTPUT_FILE_PACKAGE_NAME).append(";\n\n");
if (BASE_CLASS_PAKAGE_NAME != null && !BASE_CLASS_PAKAGE_NAME.isEmpty()) {
stringBuilder.append("import ").append(BASE_CLASS_PAKAGE_NAME).append(".").append(BASE_CLASS).append(";\n");
}
stringBuilder.append("import org.xutils.db.annotation.Column;\n");
stringBuilder.append("import org.xutils.db.annotation.Table;\n\n");
stringBuilder.append(createComment("", getTableComment(tableContent)));
stringBuilder.append("@Table(name = \"").append(tableName).append("\")\n");
if (BASE_CLASS != null && !BASE_CLASS.isEmpty()) {
stringBuilder.append("public class ").append(className).append(" extends ").append(BASE_CLASS).append(" {\n\n");
} else {
stringBuilder.append("public class ").append(className).append(" {\n\n");
}
String primaryColumName = getPrimaryKey(tableContent);
String[] lineContent = tableContent.split("\r\n");
for (int i = 1; i < lineContent.length - 2; i++) {
String line = lineContent[i];
String columnName = "";
String columnComment = "";
int start = line.indexOf(" `") + 3;
int end = line.indexOf("` ");
if (start >= 3) {
columnName = line.substring(start, end);
}
start = line.indexOf(" COMMENT '") + 10;
end = line.indexOf("',");
if (start >= 10) {
columnComment = line.substring(start, end);
}
boolean valid = true;
if (INVALID_COLUMN_NAME != null) {
for (String c : INVALID_COLUMN_NAME) {
if (c.equals(columnName)) {
valid = false;
break;
}
}
}
if (valid) {
boolean isPrimary = primaryColumName.equals(columnName);
stringBuilder.append(createColumn(columnName, columnComment, isPrimary));
}
}
stringBuilder.append("\n}");
return stringBuilder.toString();
}
/**
* 创建class名称
*
* @param tableName 表名称
* @return class名称
*/
@NonNull
public static String createClassNameByTableName(String tableName) {
String[] ws = tableName.split("_");
StringBuilder stringBuilder = new StringBuilder();
for (String w : ws) {
stringBuilder.append(w.substring(0, 1).toUpperCase()).append(w.substring(1, w.length()));
}
stringBuilder.append("Entity");
return stringBuilder.toString();
}
/**
* 创建注释
*
* @param tabSpace 左边间隔
* @param comment 注释名称
* @return string
*/
@NonNull
public static String createComment(String tabSpace, String comment) {
return new StringBuilder().append(tabSpace).append("/**\n").append(tabSpace).append(" * ").append(comment).append("\n").append(tabSpace).append(" */\n").toString();
}
/**
* 创建字段
*
* @param columnName 字段名称
* @param columnComment 字段注释
* @return string
*/
@NonNull
public static String createColumn(String columnName, String columnComment, boolean isPrimary) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(createComment(" ", columnComment));
stringBuilder.append(" public static final String ").append(columnName.toUpperCase()).append(" = \"").append(columnName).append("\";\n");
if (isPrimary) {
stringBuilder.append(" @Column(name = ").append(columnName.toUpperCase()).append(", isId = true)\n");
} else {
stringBuilder.append(" @Column(name = ").append(columnName.toUpperCase()).append(")\n");
}
stringBuilder.append(" public String ").append(columnName).append(";\n");
return stringBuilder.toString();
}
/**
* 读文件
*
* @param filePath 文件路径
* @return 文件内容
*/
public static String readFile(String filePath) {
try {
int length;
byte[] bytes = new byte[1024];
FileInputStream mFileInputStream = new FileInputStream(filePath);
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
while ((length = mFileInputStream.read(bytes)) != -1) {
arrayOutputStream.write(bytes, 0, length);
}
mFileInputStream.close();
arrayOutputStream.close();
return new String(arrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 写文件
*
* @param filePath 文件路径
* @param fileContent 文件内容
* @return true 写入成功
*/
public static boolean writeFile(String filePath, String fileContent) {
System.out.println("输出文件:" + filePath);
FileOutputStream mFileOutputStream;
try {
mFileOutputStream = new FileOutputStream(filePath);
mFileOutputStream.write(fileContent.getBytes());
mFileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}