package com.yw.project.baseadmin.util; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * 自动生成代码 */ @Slf4j public class CodeDOM { /** * 构造参数,出入表名 */ private CodeDOM(String tableName) { this.tableName = tableName; basePackage_ = "com\yw\project\baseadmin\sys\"; package_ = basePackage_ + StringUtil.camelCaseName(tableName).toLowerCase() + "\"; //System.getProperty("user.dir") 获取的是项目所在路径,如果我们是子项目,则需要添加一层路径 basePath = System.getProperty("user.dir") + "\src\main\java\" + package_; basePackage_ = "com\yw\project\baseadmin\"; } /** * 数据连接相关 */ private static final String URL = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8"; private static final String USERNAME = "root"; private static final String PASSWORD = "root"; private static final String DRIVER_CLASSNAME = "com.mysql.cj.jdbc.Driver"; /** * 表名 */ private String tableName; /** * 基础路径 */ private String basePackage_; private String package_; private String basePath; /** * 创建pojo实体类 */ private void createPojo(List<TableInfo> tableInfos) { File file = FileUtil.createFile(basePath + "pojo\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ".java"); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append( "package " + package_.replaceAll("\\", ".") + "pojo; " + " " + "import lombok.Data; " + "import javax.persistence.*; " + "import java.io.Serializable; " + "import java.util.Date; " + " " + "@Entity " + "@Table(name = "" + tableName + "") " + "@Data " + "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + " implements Serializable { " ); //遍历设置属性 for (TableInfo tableInfo : tableInfos) { //主键 if ("PRI".equals(tableInfo.getColumnKey())) { stringBuffer.append(" @Id "); } //自增 if ("auto_increment".equals(tableInfo.getExtra())) { stringBuffer.append(" @GeneratedValue(strategy= GenerationType.IDENTITY) "); } stringBuffer.append(" private " + StringUtil.typeMapping(tableInfo.getDataType()) + " " + StringUtil.camelCaseName(tableInfo.getColumnName()) + ";//" + tableInfo.getColumnComment() + " "); } stringBuffer.append("}"); FileUtil.fileWriter(file, stringBuffer); } /** * 创建vo类 */ private void createVo(List<TableInfo> tableInfos) { File file = FileUtil.createFile(basePath + "vo\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo.java"); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append( "package " + package_.replaceAll("\\", ".") + "vo; " + " " + "import "+ basePackage_.replaceAll("\\", ".") +" common.pojo.PageCondition;"+ "import lombok.Data; " + "import java.io.Serializable; " + "import java.util.Date; " + " " + "@Data " + "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo extends PageCondition implements Serializable { " ); //遍历设置属性 for (TableInfo tableInfo : tableInfos) { stringBuffer.append(" private " + StringUtil.typeMapping(tableInfo.getDataType()) + " " + StringUtil.camelCaseName(tableInfo.getColumnName()) + ";//" + tableInfo.getColumnComment() + " "); } stringBuffer.append("}"); FileUtil.fileWriter(file, stringBuffer); } /** * 创建repository类 */ private void createRepository(List<TableInfo> tableInfos) { File file = FileUtil.createFile(basePath + "repository\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Repository.java"); StringBuffer stringBuffer = new StringBuffer(); String t = "String"; //遍历属性 for (TableInfo tableInfo : tableInfos) { //主键 if ("PRI".equals(tableInfo.getColumnKey())) { t = StringUtil.typeMapping(tableInfo.getDataType()); } } stringBuffer.append( "package " + package_.replaceAll("\\", ".") + "repository; " + " " + "import " + basePackage_.replaceAll("\\", ".") + "common.repository.*; " + "import " + package_.replaceAll("\\", ".") + "pojo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "; " + "import org.springframework.stereotype.Repository; " + " " + "@Repository " + "public interface " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Repository extends CommonRepository<" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ", " + t + "> {" ); stringBuffer.append(" "); stringBuffer.append("}"); FileUtil.fileWriter(file, stringBuffer); } /** * 创建service类 */ private void createService(List<TableInfo> tableInfos) { File file = FileUtil.createFile(basePath + "service\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Service.java"); StringBuffer stringBuffer = new StringBuffer(); String t = "String"; //遍历属性 for (TableInfo tableInfo : tableInfos) { //主键 if ("PRI".equals(tableInfo.getColumnKey())) { t = StringUtil.typeMapping(tableInfo.getDataType()); } } stringBuffer.append( "package " + package_.replaceAll("\\", ".") + "service; " + " " + "import " + basePackage_.replaceAll("\\", ".") + "common.service.*; " + "import " + package_.replaceAll("\\", ".") + "pojo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "; " + "import " + package_.replaceAll("\\", ".") + "vo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo; " + " " + "public interface " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Service extends CommonService<" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo, " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ", " + t + "> {" ); stringBuffer.append(" "); stringBuffer.append("}"); FileUtil.fileWriter(file, stringBuffer); //Impl File file1 = FileUtil.createFile(basePath + "service\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "ServiceImpl.java"); StringBuffer stringBuffer1 = new StringBuffer(); stringBuffer1.append( "package " + package_.replaceAll("\\", ".") + "service; " + " " + "import " + basePackage_.replaceAll("\\", ".") + "common.service.*; " + "import " + package_.replaceAll("\\", ".") + "pojo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "; " + "import " + package_.replaceAll("\\", ".") + "vo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo; " + "import " + package_.replaceAll("\\", ".") + "repository." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Repository; " + "import org.springframework.beans.factory.annotation.Autowired; " + "import org.springframework.stereotype.Service; " + "import org.springframework.transaction.annotation.Transactional; " + "import javax.persistence.EntityManager; " + "import javax.persistence.PersistenceContext; " + " " + "@Service " + "@Transactional " + "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "ServiceImpl extends CommonServiceImpl<" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo, " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ", " + t + "> implements " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Service{" ); stringBuffer1.append(" "); stringBuffer1.append( " @PersistenceContext " + " private EntityManager em; "); stringBuffer1.append("" + " @Autowired " + " private " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Repository " + StringUtil.camelCaseName(tableName) + "Repository; "); stringBuffer1.append("}"); FileUtil.fileWriter(file1, stringBuffer1); } /** * 创建controller类 */ private void createController(List<TableInfo> tableInfos) { File file = FileUtil.createFile(basePath + "controller\" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Controller.java"); StringBuffer stringBuffer = new StringBuffer(); String t = "String"; //遍历属性 for (TableInfo tableInfo : tableInfos) { //主键 if ("PRI".equals(tableInfo.getColumnKey())) { t = StringUtil.typeMapping(tableInfo.getDataType()); } } stringBuffer.append( "package " + package_.replaceAll("\\", ".") + "controller; " + " " + "import " + basePackage_.replaceAll("\\", ".") + "common.controller.*; " + "import " + package_.replaceAll("\\", ".") + "pojo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "; " + "import " + package_.replaceAll("\\", ".") + "vo." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo; " + "import " + package_.replaceAll("\\", ".") + "service." + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Service; " + "import org.springframework.beans.factory.annotation.Autowired; " + "import org.springframework.web.bind.annotation.*; " + " " + "@RestController " + "@RequestMapping("/sys/" + StringUtil.camelCaseName(tableName) + "/") " + "public class " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Controller extends CommonController<" + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Vo, " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + ", " + t + "> {" ); stringBuffer.append(" "); stringBuffer.append("" + " @Autowired " + " private " + StringUtil.captureName(StringUtil.camelCaseName(tableName)) + "Service " + StringUtil.camelCaseName(tableName) + "Service; "); stringBuffer.append("}"); FileUtil.fileWriter(file, stringBuffer); } /** * 获取表结构信息 */ private List<TableInfo> getTableInfo() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ArrayList<TableInfo> list = new ArrayList<>(); try { conn = DBConnectionUtil.getConnection(); String sql = "select column_name,data_type,column_comment,column_key,extra from information_schema.columns where table_name=?"; ps = conn.prepareStatement(sql); ps.setString(1, tableName); rs = ps.executeQuery(); while (rs.next()) { TableInfo tableInfo = new TableInfo(); //列名,全部转为小写 tableInfo.setColumnName(rs.getString("column_name").toLowerCase()); //列类型 tableInfo.setDataType(rs.getString("data_type")); //列注释 tableInfo.setColumnComment(rs.getString("column_comment")); //主键 tableInfo.setColumnKey(rs.getString("column_key")); //主键类型 tableInfo.setExtra(rs.getString("extra")); list.add(tableInfo); } } catch (SQLException e) { //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } finally { assert rs != null; DBConnectionUtil.close(conn, ps, rs); } return list; } /** * file工具类 */ private static class FileUtil { /** * 创建文件 * * @param pathNameAndFileName 路径跟文件名 * @return File对象 */ private static File createFile(String pathNameAndFileName) { File file = new File(pathNameAndFileName); try { //获取父目录 File fileParent = file.getParentFile(); if (!fileParent.exists()) { fileParent.mkdirs(); } //创建文件 if (!file.exists()) { file.createNewFile(); } } catch (Exception e) { file = null; System.err.println("新建文件操作出错"); //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } return file; } /** * 字符流写入文件 * * @param file file对象 * @param stringBuffer 要写入的数据 */ private static void fileWriter(File file, StringBuffer stringBuffer) { //字符流 try { FileWriter resultFile = new FileWriter(file, false);//true,则追加写入 false,则覆盖写入 PrintWriter myFile = new PrintWriter(resultFile); //写入 myFile.println(stringBuffer.toString()); myFile.close(); resultFile.close(); } catch (Exception e) { System.err.println("写入操作出错"); //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } } } /** * 字符串处理工具类 */ private static class StringUtil { /** * 数据库类型->JAVA类型 * * @param dbType 数据库类型 * @return JAVA类型 */ private static String typeMapping(String dbType) { String javaType; if ("int|integer".contains(dbType)) { javaType = "Integer"; } else if ("float|double|decimal|real".contains(dbType)) { javaType = "Double"; } else if ("date|time|datetime|timestamp".contains(dbType)) { javaType = "Date"; } else { javaType = "String"; } return javaType; } /** * 驼峰转换为下划线 */ public static String underscoreName(String camelCaseName) { StringBuilder result = new StringBuilder(); if (camelCaseName != null && camelCaseName.length() > 0) { result.append(camelCaseName.substring(0, 1).toLowerCase()); for (int i = 1; i < camelCaseName.length(); i++) { char ch = camelCaseName.charAt(i); if (Character.isUpperCase(ch)) { result.append("_"); result.append(Character.toLowerCase(ch)); } else { result.append(ch); } } } return result.toString(); } /** * 首字母大写 */ static String captureName(String name) { char[] cs = name.toCharArray(); cs[0] -= 32; return String.valueOf(cs); } /** * 下划线转换为驼峰 */ static String camelCaseName(String underscoreName) { StringBuilder result = new StringBuilder(); if (underscoreName != null && underscoreName.length() > 0) { boolean flag = false; for (int i = 0; i < underscoreName.length(); i++) { char ch = underscoreName.charAt(i); if ("_".charAt(0) == ch) { flag = true; } else { if (flag) { result.append(Character.toUpperCase(ch)); flag = false; } else { result.append(ch); } } } } return result.toString(); } } /** * JDBC连接数据库工具类 */ private static class DBConnectionUtil { static { // 1、加载驱动 try { Class.forName(DRIVER_CLASSNAME); } catch (ClassNotFoundException e) { //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } } /** * 返回一个Connection连接 */ static Connection getConnection() { Connection conn = null; // 2、连接数据库 try { conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } return conn; } /** * 关闭Connection,Statement连接 */ public static void close(Connection conn, Statement stmt) { try { conn.close(); stmt.close(); } catch (SQLException e) { //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } } /** * 关闭Connection,Statement,ResultSet连接 */ public static void close(Connection conn, Statement stmt, ResultSet rs) { try { close(conn, stmt); rs.close(); } catch (SQLException e) { //输出到日志文件中 log.error(ErrorUtil.errorInfoToString(e)); } } } /** * 表结构行信息实体类 */ private class TableInfo { private String columnName; private String dataType; private String columnComment; private String columnKey; private String extra; TableInfo() { } String getColumnName() { return columnName; } void setColumnName(String columnName) { this.columnName = columnName; } String getDataType() { return dataType; } void setDataType(String dataType) { this.dataType = dataType; } String getColumnComment() { return columnComment; } void setColumnComment(String columnComment) { this.columnComment = columnComment; } String getColumnKey() { return columnKey; } void setColumnKey(String columnKey) { this.columnKey = columnKey; } String getExtra() { return extra; } void setExtra(String extra) { this.extra = extra; } } /** * 快速创建,供外部调用,调用之前先设置一下项目的基础路径 */ private String create() { List<TableInfo> tableInfo = getTableInfo(); createPojo(tableInfo); createVo(tableInfo); createRepository(tableInfo); createService(tableInfo); createController(tableInfo); System.out.println("生成路径位置:" + basePath); return tableName + " 后台代码生成完毕!"; } public static void main(String[] args) { //String[] tables = {"sys_user","sys_menu","sys_authority","sys_user_menu","sys_user_authority","sys_shortcut_menu","sys_setting"}; String[] tables = {"testflink"}; for (String table : tables) { String msg = new CodeDOM(table).create(); System.out.println(msg); } } }