diff --git a/build.gradle b/build.gradle index adff0dd..69f084b 100644 --- a/build.gradle +++ b/build.gradle @@ -21,8 +21,12 @@ dependencies { implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.2' implementation 'com.baomidou:mybatis-plus-generator:3.4.1' implementation 'org.freemarker:freemarker:2.3.31' - implementation 'org.springframework.boot:spring-boot-configuration-processor' + implementation 'org.springframework.boot:spring-boot-configuration-processor' implementation 'org.postgresql:postgresql:42.2.19' + implementation 'org.springframework.boot:spring-boot-configuration-processor:2.1.4.RELEASE' + // https://mvnrepository.com/artifact/org.projectlombok/lombok + implementation'org.projectlombok:lombok:1.18.20' + } test { diff --git a/src/main/java/cn/rainss/codegenerator/CodeGeneratorApplication.java b/src/main/java/cn/rainss/codegenerator/CodeGeneratorApplication.java deleted file mode 100644 index 731a370..0000000 --- a/src/main/java/cn/rainss/codegenerator/CodeGeneratorApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.rainss.codegenerator; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CodeGeneratorApplication { - - public static void main(String[] args) { - SpringApplication.run(CodeGeneratorApplication.class, args); - } - -} diff --git a/src/main/java/cn/rainss/codegenerator/DDDGenerator.java b/src/main/java/cn/rainss/codegenerator/DDDGenerator.java new file mode 100644 index 0000000..6d14902 --- /dev/null +++ b/src/main/java/cn/rainss/codegenerator/DDDGenerator.java @@ -0,0 +1,7 @@ +package cn.rainss.codegenerator; + +public class DDDGenerator { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/cn/rainss/codegenerator/Main.java b/src/main/java/cn/rainss/codegenerator/Main.java deleted file mode 100644 index fced08f..0000000 --- a/src/main/java/cn/rainss/codegenerator/Main.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.rainss.codegenerator; - -import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; -import com.baomidou.mybatisplus.core.toolkit.StringPool; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.generator.AutoGenerator; -import com.baomidou.mybatisplus.generator.InjectionConfig; -import com.baomidou.mybatisplus.generator.config.*; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; - -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class Main { - /** - *

- * 读取控制台内容 - *

- */ - public static String scanner(String tip) { - System.out.printf("当前路径"+System.getProperty("user.dir")); - Scanner scanner = new Scanner(System.in); - StringBuilder help = new StringBuilder(); - help.append("请输入" + tip + ":"); - System.out.println(help.toString()); - if (scanner.hasNext()) { - String ipt = scanner.next(); - if (StringUtils.isNotBlank(ipt)) { - return ipt; - } - } - throw new MybatisPlusException("请输入正确的" + tip + "!"); - } - - public static void main(String[] args) { - // 代码生成器 - AutoGenerator mpg = new AutoGenerator(); - - // 全局配置 - GlobalConfig gc = new GlobalConfig(); - String projectPath = System.getProperty("user.dir"); - gc.setOutputDir(projectPath + "/src/main/java"); - gc.setAuthor("jobob"); - gc.setOpen(false); - // gc.setSwagger2(true); 实体属性 Swagger2 注解 - mpg.setGlobalConfig(gc); - - // 数据源配置 - DataSourceConfig dsc = new DataSourceConfig(); - dsc.setUrl("jdbc:postgresql://db.timemail.email:5432/timemail"); - // dsc.setSchemaName("public"); - dsc.setDriverName("org.postgresql.Driver"); - dsc.setUsername("postgres"); - dsc.setPassword("timemail.email"); - mpg.setDataSource(dsc); - - // 包配置 - PackageConfig pc = new PackageConfig(); - pc.setModuleName(scanner("模块名")); - pc.setParent("com.baomidou.ant"); - mpg.setPackageInfo(pc); - - // 自定义配置 - InjectionConfig cfg = new InjectionConfig() { - @Override - public void initMap() { - // to do nothing - } - }; - - // 如果模板引擎是 freemarker - String templatePath = "/templates/mapper.xml.ftl"; - // 如果模板引擎是 velocity - // String templatePath = "/templates/mapper.xml.vm"; - - // 自定义输出配置 - List focList = new ArrayList<>(); - // 自定义配置会被优先输出 - focList.add(new FileOutConfig(templatePath) { - @Override - public String outputFile(TableInfo tableInfo) { - // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! - return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() - + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; - } - }); - /* - cfg.setFileCreate(new IFileCreate() { - @Override - public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { - // 判断自定义文件夹是否需要创建 - checkDir("调用默认方法创建的目录,自定义目录用"); - if (fileType == FileType.MAPPER) { - // 已经生成 mapper 文件判断存在,不想重新生成返回 false - return !new File(filePath).exists(); - } - // 允许生成模板文件 - return true; - } - }); - */ - cfg.setFileOutConfigList(focList); - mpg.setCfg(cfg); - - // 配置模板 - TemplateConfig templateConfig = new TemplateConfig(); - - // 配置自定义输出模板 - //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 - // templateConfig.setEntity("templates/entity2.java"); - // templateConfig.setService(); - // templateConfig.setController(); - - templateConfig.setXml(null); - mpg.setTemplate(templateConfig); - - // 策略配置 - StrategyConfig strategy = new StrategyConfig(); - strategy.setNaming(NamingStrategy.underline_to_camel); - strategy.setColumnNaming(NamingStrategy.underline_to_camel); - strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); - strategy.setEntityLombokModel(true); - strategy.setRestControllerStyle(true); - // 公共父类 - strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); - // 写于父类中的公共字段 - strategy.setSuperEntityColumns("id"); - strategy.setTablePrefix("tm_"); - strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); - strategy.setControllerMappingHyphenStyle(true); - strategy.setTablePrefix(pc.getModuleName() + "_"); - mpg.setStrategy(strategy); - mpg.setTemplateEngine(new FreemarkerTemplateEngine()); - mpg.execute(); - } -} diff --git a/src/main/java/cn/rainss/codegenerator/config/PGConfig.java b/src/main/java/cn/rainss/codegenerator/config/PGConfig.java new file mode 100644 index 0000000..3ae15c3 --- /dev/null +++ b/src/main/java/cn/rainss/codegenerator/config/PGConfig.java @@ -0,0 +1,35 @@ +package cn.rainss.codegenerator.config; + + +/** + * 数据库配置常量 + * + * @author rainerosion + */ +public class PGConfig { + /** + * 数据库驱动类 + */ + public static final String driverClass = "org.postgresql.Driver"; + + /** + * 数据库用户名 + */ + public static final String username = "postgres"; + + /** + * 密码 + */ + public static final String password = "timemail.email"; + + /** + * 数据库 + */ + public static final String catalog = "timemail"; + + /** + * 链接地址 + */ + public static final String url = "jdbc:postgresql://db.timemail.email:5432/timemail"; + +} diff --git a/src/main/java/cn/rainss/codegenerator/utils/ColumnClass.java b/src/main/java/cn/rainss/codegenerator/utils/ColumnClass.java new file mode 100644 index 0000000..cce998d --- /dev/null +++ b/src/main/java/cn/rainss/codegenerator/utils/ColumnClass.java @@ -0,0 +1,40 @@ +package cn.rainss.codegenerator.utils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 列对应 + * + * @author echo cow + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ColumnClass { + /** + * 表名称 + */ + private String tableName; + /** + * 列名称 + */ + private String columnName; + /** + * 列大小 + */ + private Integer columnSize; + /** + * 列的类型 + */ + private String columnType; + /** + * 列的注释 + */ + private String columnComment; + /** + * 是否能为空值 + */ + private Boolean nullAble; +} diff --git a/src/main/java/cn/rainss/codegenerator/utils/DatabaseUtils.java b/src/main/java/cn/rainss/codegenerator/utils/DatabaseUtils.java new file mode 100644 index 0000000..a9f3923 --- /dev/null +++ b/src/main/java/cn/rainss/codegenerator/utils/DatabaseUtils.java @@ -0,0 +1,91 @@ +package cn.rainss.codegenerator.utils; + +import cn.rainss.codegenerator.config.PGConfig; + +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class DatabaseUtils { + public DatabaseUtils(){} + + public DatabaseUtils(PGConfig config){ + + } + + /** + * 获取数据库元数据 + * + * @return 元数据 + * @throws Exception 异常 + */ + private DatabaseMetaData getMetaData() throws Exception { + Class.forName(PGConfig.driverClass); + return DriverManager.getConnection(PGConfig.url, + PGConfig.username, PGConfig.password).getMetaData(); + } + + /** + * 获取库的所有表 + * + * @return 所有表 + */ + public List getTables() { + List tables = new ArrayList<>(); + try { + ResultSet resultSet = getMetaData().getTables(PGConfig.catalog, null, + "%", new String[]{"TABLE"}); + while (resultSet.next()) { + String tableName = resultSet.getString("TABLE_NAME"); + tables.add(tableName); + } + resultSet.close(); + } catch (Exception e) { +// log.error("Please check your database conf! {}", e.getMessage()); + e.printStackTrace(); + } + return tables; + } + + /** + * 获取指定表的所有列 + * + * @param tableName 表名 + * @return 所有列的集合 + */ + public List getColumns(String tableName) { + try (ResultSet resultSet = getMetaData().getColumns(PGConfig.catalog, null, tableName, "%")) { + return getColumns(resultSet, tableName); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取某列的结果集抽取 + * + * @param resultSet 结果集 + * @param tableName 表名 + * @throws SQLException 异常 + */ + private List getColumns(ResultSet resultSet, String tableName) throws SQLException { + List columns = new ArrayList<>(); + while (resultSet.next()) { + String columnName = resultSet.getString("COLUMN_NAME"); + String remarks = resultSet.getString("REMARKS"); + Boolean nullAble = resultSet.getInt("NULLABLE") == 1; + columns.add(new ColumnClass( + tableName, + GenUtil.underlineToHump(columnName), + resultSet.getInt("COLUMN_SIZE"), + GenUtil.fieldConversion(resultSet.getString("TYPE_NAME")), + remarks, nullAble + )); + } + return columns; + } +} diff --git a/src/main/java/cn/rainss/codegenerator/utils/GenUtil.java b/src/main/java/cn/rainss/codegenerator/utils/GenUtil.java new file mode 100644 index 0000000..6029f86 --- /dev/null +++ b/src/main/java/cn/rainss/codegenerator/utils/GenUtil.java @@ -0,0 +1,83 @@ +package cn.rainss.codegenerator.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +/** + * 工具类 + * + * @author echo + */ +@Slf4j +public class GenUtil { + private static final String UNDERLINE = "_"; + private static final Map MYSQL_TO_JAVA = new HashMap<>(); + public static final String SUFFIX = ".java"; + + static { + MYSQL_TO_JAVA.put("VARCHAR", "java.lang.String"); + MYSQL_TO_JAVA.put("BIGINT", "java.lang.Long"); + MYSQL_TO_JAVA.put("DATE", "java.time.LocalDate"); + MYSQL_TO_JAVA.put("FLOAT", "java.lang.Float"); + MYSQL_TO_JAVA.put("TINYINT", "java.lang.Integer"); + MYSQL_TO_JAVA.put("INT", "java.lang.Integer"); + MYSQL_TO_JAVA.put("INT2", "java.lang.Short"); + MYSQL_TO_JAVA.put("INT4", "java.lang.Integer"); + MYSQL_TO_JAVA.put("INT8", "java.lang.Long"); + MYSQL_TO_JAVA.put("BINARY", "java.lang.Byte"); + MYSQL_TO_JAVA.put("SMALLINT", "java.lang.Short"); + MYSQL_TO_JAVA.put("DATETIME", "java.time.LocalDateTime"); + MYSQL_TO_JAVA.put("TIMESTAMP", "java.time.LocalDateTime"); + MYSQL_TO_JAVA.put("BIT", "java.lang.Boolean"); + } + + + /** + * 下划线命名转驼峰式命名 + * + * @param para 下划线命名 + * @return 驼峰式命名 + */ + public static String underlineToHump(String para) { + StringBuilder result = new StringBuilder(); + for (String s : para.split(UNDERLINE)) { + if (!para.contains("_")) { + result.append(s); + continue; + } + if (result.length() == 0) { + result.append(s.toLowerCase()); + } else { + result.append(s.substring(0, 1).toUpperCase()); + result.append(s.substring(1).toLowerCase()); + } + } + return result.toString(); + } + + /** + * 下划线命名转驼峰式命名 + * + * @param para 下划线命名 + * @param firstCharChange 首字母是否转换 + * @return 驼峰式命名 + */ + public static String underlineToHump(String para, boolean firstCharChange) { + String result = underlineToHump(para); + return firstCharChange ? result.substring(0, 1).toUpperCase() + result.substring(1) : result; + } + + /** + * 数据库字段转换 + * + * @param mysqlDataType 数据库字段类型 + * @return 转换结果 + */ + public static String fieldConversion(String mysqlDataType) { + return MYSQL_TO_JAVA.getOrDefault(mysqlDataType, "Object"); + } + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..f01b703 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +application: + generate: + # 驱动类 + driver-class: org. + # 用户名 + username: root + # 密码 + password: 123456 + # 库名 + catalog: generate + # 数据库地址 + url: jdbc:postgresql://db.timemail.email:5432/timemail \ No newline at end of file diff --git a/src/main/resources/template/entity.ftl b/src/main/resources/template/entity.ftl new file mode 100644 index 0000000..4ef70a1 --- /dev/null +++ b/src/main/resources/template/entity.ftl @@ -0,0 +1,26 @@ +package ${package_name}; + +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.Table; +import java.io.Serializable; + +/** +* ${table_name} +* +* @author rainerosion +* @date ${.now?datetime} +*/ +@Data +@Table(name = "${table_name}") +@Entity(name = "${table_name}") +public class ${class_name} implements Serializable { +<#list columns as column> + + /** + * ${column.columnComment} + */ + private ${column.columnType} ${column.columnName}; + +} \ No newline at end of file