package cn.com.fmsh.nfcos.sapo.biz;
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import java.io.*;
import java.sql.*;
/**
* 数据库实体类生成工具
*
* @author wanglifeng
*/
public class DbModelGenerator {
// 数据库驱动名
// Oracle: oracle.jdbc.OracleDriver
// MariaDB: org.mariadb.jdbc.Driver
// MySQL: com.mysql.jdbc.Driver
private static String ORACLE_DATABASE_DRIVER = "oracle.jdbc.OracleDriver";
private static String MARIADB_DATABASE_DRIVER = "org.mariadb.jdbc.Driver";
private static String MYSQL_DATABASE_DRIVER = "com.mysql.jdbc.Driver";
private static String driver = MYSQL_DATABASE_DRIVER;
// 数据库连接配置
// private static String url = "jdbc:mysql://gz-cdb-guj8pt5q.sql.tencentcdb.com:62661/db_cake_dev?useUnicode=true&characterEncoding=utf8&useSSL=false";
private static String url = "jdbc:mariadb://192.168.110.22:3306/db_sapo_dev?useUnicode=true&characterEncoding=utf8&useSSL=false";
// 数据库用户名
// private static String username = "du_cake_dev";
private static String username = "du_sapo_dev";
// 数据库密码
// private static String password = "nfc2022dev";
private static String password = "nfc2022dev";
// 指定数据库表对应的实体类的生成位置
private static String targetProject = "src/test/java";
private static String modelPackageName = "cn.com.fmsh.nfcos.sapo.biz.test1";
private static String domainPackageName = "cn.com.fmsh.nfcos.sapo.biz.test2";
private static String servicePackageName = "cn.com.fmsh.nfcos.sapo.biz.test3";
// 指定需要进行代码生成的相关数据库表,空则为生成所有
private static List tableNameList = new ArrayList<>();
static {
// tableNameList.add("tbl_task");
}
private static HashMap jdbcType2javaMap = new HashMap();
static {
// jdbc类型和java类型映射关系
jdbcType2javaMap.put("VARCHAR", "String");
jdbcType2javaMap.put("INTEGER", "Integer");
jdbcType2javaMap.put("TIMESTAMP", "LocalDateTime");
jdbcType2javaMap.put("TINYINT", "Byte");
jdbcType2javaMap.put("BIGINT", "Long");
jdbcType2javaMap.put("BLOB", "byte[]");
jdbcType2javaMap.put("LONGBLOB", "byte[]");
jdbcType2javaMap.put("DATETIME", "LocalDateTime");
jdbcType2javaMap.put("LONGTEXT", "String");
jdbcType2javaMap.put("SMALLINT", "Short");
jdbcType2javaMap.put("INT", "Integer");
jdbcType2javaMap.put("VARCHAR2", "String");
jdbcType2javaMap.put("CHAR", "String");
jdbcType2javaMap.put("NUMBER", "BigDecimal");
jdbcType2javaMap.put("DATE", "LocalDateTime");
jdbcType2javaMap.put("NVARCHAR2", "String");
jdbcType2javaMap.put("TIMESTAMP(6)", "LocalDateTime");
jdbcType2javaMap.put("CLOB", "String");
}
private static String jdbcTypeToJava(String jdbcType) {
String javaDataType = jdbcType2javaMap.get(jdbcType.toUpperCase());
if (javaDataType == null) {
System.out.println("Unknow data type, please add to jdbcType2javaMap " + jdbcType);
return "String";
}
return javaDataType;
}
// 将表名转化为model实体类名称
private static String tblName2ModelFileName(String tblName) {
String className = firstUpper(lineToHump(tblName.toLowerCase()));// tbl_sapo_act => TblSapoAct
if (className.startsWith("Tbl")) {
className = className.substring(3); // TblSapoAct => SapoAct
}
return className;
}
// 将表明转化成domain实体类名称
private static String tblName2DomainFileName(String tblName) {
// 表名转文件名。
String modelName = lineToHump(tblName.toLowerCase());//tbl_sapo_act => tblSapoAct
if (modelName.startsWith("tbl")) {
modelName = modelName.substring(3);
}
String className = firstUpper(modelName + "Info"); // SapoActInfo
return className;
}
// TODO
public static void main(String[] args) throws IOException {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
try {
Connection con = DriverManager.getConnection(url, username, password);
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// 获取map,内容为:[表名:字段集合]
Map> tableAndTheirColumnsMap = getTablesAndTheirColumnsMap(st);
// 获取所有表的外键集合
List fkInfo = getFkInfo(st);
// 获取所有的表的常量集合,没有常量就打印日志即可
Map> tableAndTheirConstantsMap = new HashMap<>();
try {
tableAndTheirConstantsMap = getTableAndTheirConstantsMap(st);
} catch (Exception e) {
System.err.println("No constant info, " + e.getMessage());
}
// 遍历所有的表
Iterator>> iterator = tableAndTheirColumnsMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry> entry = iterator.next();
// 循环,一个表,一个表的生成model文件,方法入参:表名,字段列表,该表所有常量
generateModelFile(entry.getKey(), entry.getValue(), tableAndTheirConstantsMap.get(entry.getKey()));
// 循环,一个表,一个表的生成domain文件
generateDomainFile(entry.getKey(), entry.getValue(), fkInfo);
}
System.out.println("----------Generate database entity finished----------");
// ResData 接口
writeDomainContentInFile("ResData",template4ResData());
// pageInfo 类
writeDomainContentInFile("PageInfo",template4PageInfo());
// MySpringUtils 类
writeDomainContentInFile("MySpringUtils",template4MySpringUtils());
// LocalDateTimeGlobalConfig 类
writeDomainContentInFile("LocalDateTimeGlobalConfig",template4LocalDateTimeGlobalConfig());
// ThreadLocalCache 类
writeDomainContentInFile("ThreadLocalCache",template4ThreadLocalCache());
// model
writeModelContentToFile(template4CommonDaoFile(), "CommonDao");
writeModelContentToFile(template4CommonModelFile(), "CommonModel");
writeModelContentToFile(template4CommonMapperFile(), "CommonMapper");
writeModelContentToFile(template4ObjPageFile(), "ObjPage");
// service 层方法
writeServiceContentToFile(template4DataAuthAspectFile(), "Aspect4DataAuth");
writeServiceContentToFile(template4Aspect4ControllerFile(),"Aspect4Controller");
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static String template4ThreadLocalCache() {
String template = String.join(System.lineSeparator(),
"package {packageName};",
"",
"import java.util.*;",
"",
"import {modelPackageName}.*;",
"",
"public class ThreadLocalCache extends BaseLogger {",
"",
" public static final ThreadLocal,>,>,>,>,>
Original: https://www.cnblogs.com/wanglifeng717/p/16324532.html
Author: 王李峰
Title: 通用查询解决方案
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592449/
转载文章受原作者版权保护。转载请注明原作者出处!