本站建设:代码生成starter

文章来源原创   作者:临窗旋墨   发布时间:2021-06-22   阅读:816   标签:starter,springboot

003-编码代码生成starter

2020-04-01

说明: 初始的代码生成是直接放在boot-war-web项目的pers.vic.boot.console.generator模块下的, 个人觉得应该抽离成一个starter,更方便集成一些。

另:boot-starter-generator 既可以作为starter集成, 也可以下放开 GeneratorApplication.java上的@SpringBootApplication从而独立运行

一 生成代码的基本思路

  1. 连接数据库获取数据库表的全部信息(本项目暂只实现mysql版本)
    • 支持多种数据库,定义dao接口,不同的数据库做不同的实现,根据配置文件指定Primary
  2. 解析表的基本信息,列的基本信息映射成对象
  3. 编写各层模板(本项目使用的是velocity),根据解析的数据对模板进行填充
  4. 导出填充后的模板

boot-starter-generator 的简单说明

1 配置文件 参考 generator-config.properties
  1. #代码生成器,配置信息
  2. #包名
  3. generator.packageName=pers.vic.boot.console
  4. #模块名
  5. generator.moduleName=system
  6. #作者
  7. generator.author=Vic.xu
  8. #Email
  9. generator.email=xuduochoua@163.com
  10. #表前缀(类名不会包含表前缀)
  11. generator.tablePrefix=t_
  12. #实体中忽略的字段(在基类中的字段) 另:列名转换成属性名的时候 is_delete格式会变成delete
  13. #generator.ignores=id,is_enable,is_delete,create_time,update_time
  14. generator.ignores=ID,CREATE_USER_ID,CREATE_TIME,LAST_UPDATE_USER_ID,LAST_UPDATE_TIME,ENABLE_FLAG
  15. #需要填充的模板
  16. generator.templates[0]=generator/templates/Entity.java.vm
  17. generator.templates[1]=generator/templates/Mapper.java.vm
  18. generator.templates[2]=generator/templates/Mapper.xml.vm
  19. generator.templates[3]=generator/templates/Service.java.vm
  20. generator.templates[4]=generator/templates/Controller.java.vm
  21. #数据类型转换,配置信息:数据库类型->java类型
  22. generator.dataTypeConvert.tinyint=Integer
  23. generator.dataTypeConvert.smallint=Inteer
  24. generator.dataTypeConvert.mediumint=Integer
  25. generator.dataTypeConvert.int=Integer
  26. generator.dataTypeConvert.integer=Integer
  27. generator.dataTypeConvert.bigint=Long
  28. generator.dataTypeConvert.float=Float
  29. generator.dataTypeConvert.double=Double
  30. generator.dataTypeConvert.decimal=BigDecimal
  31. generator.dataTypeConvert.bit=Boolean
  32. generator.dataTypeConvert.enum=String
  33. generator.dataTypeConvert.char=String
  34. generator.dataTypeConvert.varchar=String
  35. generator.dataTypeConvert.tinytext=String
  36. generator.dataTypeConvert.text=String
  37. generator.dataTypeConvert.mediumtext=String
  38. generator.dataTypeConvert.longtext=String
  39. generator.dataTypeConvert.date=Date
  40. generator.dataTypeConvert.time=Date
  41. generator.dataTypeConvert.datetime=Date
  42. generator.dataTypeConvert.timestamp=Date
2 代码生成starter 入口 GeneratorAutoconfigigure
  • 根据配置的generator.database 数据库类型, 注册不同的GeneratorDao实现类,本项目暂时已经实现了mysql版本的GeneratorDao;dao的对数据库的查询操作使用的是jdbcTemplate
  1. /**
  2. * @description: 代码生成starter 入口
  3. * @author: Vic.xu
  4. * @date: 2020年3月10日 上午10:54:39
  5. */
  6. @Configuration
  7. @ConditionalOnClass(value = { JdbcTemplate.class })
  8. @ConditionalOnWebApplication
  9. @ConditionalOnExpression("${generatir.enabled:true}")
  10. @EnableConfigurationProperties(GeneratorProperties.class)
  11. public class GeneratorAutoconfigigure {
  12. /**
  13. * 本项目中支持的各个数据库类型
  14. */
  15. @Autowired
  16. private Collection<GeneratorDao> generatorDaoList;
  17. /**
  18. * 当前配置的数据库类型 默认MYSQL
  19. */
  20. @Value("${generator.database:mysql}")
  21. private String database;
  22. @Primary
  23. @Bean
  24. public GeneratorDao getGeneratorDao() {
  25. DatabaseType type = DatabaseType.getByName(database);
  26. Assert.notNull(type, "当前项目未支持" + database + "类型的数据库代码生成");
  27. GeneratorDao dao = null;
  28. for(GeneratorDao generatorDao : generatorDaoList) {
  29. if(type == generatorDao.databaseType()) {
  30. dao = generatorDao;
  31. break;
  32. }
  33. }
  34. Assert.notNull(dao, "当前项目未实现" + database + "类型的数据库的GeneratorDao");
  35. return dao;
  36. }
  37. }
  • 配置类GeneratorProperties
  1. /**
  2. * @description: 附件配置项
  3. * @author: Vic.xu
  4. * @date: 2019年12月11日 上午9:33:21
  5. */
  6. @Configuration
  7. @ConfigurationProperties(prefix = GeneratorProperties.GENERATOR_PREFIX)
  8. @PropertySource("classpath:config/generator-config.properties")
  9. @JsonIgnoreProperties({"beanExpressionResolver"})
  10. public class GeneratorProperties implements Serializable{
  11. private static final long serialVersionUID = 1L;
  12. public static final String GENERATOR_PREFIX = "generator";
  13. @Value("${generator.database:mysql}")
  14. private String database;
  15. /**
  16. * 包名
  17. */
  18. private String packageName;
  19. /**
  20. * 包名
  21. */
  22. private String moduleName;
  23. /**
  24. * 作者
  25. */
  26. private String author;
  27. /**
  28. * email
  29. */
  30. private String email;
  31. /**
  32. * 表前缀 若存在则生成的实体名会去掉前缀
  33. */
  34. private String tablePrefix;
  35. /**
  36. * 实体中忽略的表字段
  37. */
  38. private Set<String> ignores;
  39. /**
  40. * 大文本类型的数据库数据格式,不应该出现在列表页
  41. */
  42. private Set<String> textTypes;
  43. /**
  44. * 需要填充的数据模板
  45. */
  46. private List<String> templates;
  47. /**
  48. * 数据类型转换 数据库类型--> java 类型
  49. */
  50. private Map<String, String> dataTypeConvert;
  51. @Override
  52. public String toString() {
  53. return "GeneratorProperties [packageName=" + packageName + ",\n moduleName=" + moduleName + ",\n author=" + author
  54. + ",\n email=" + email + ",\n tablePrefix=" + tablePrefix + ",\n ignores=" + ignores + ",\n templates="
  55. + templates + ",\n dataTypeConvert=" + dataTypeConvert + "]";
  56. }
  57. public String getPackageName() {
  58. return packageName;
  59. }
  60. public String getModuleName() {
  61. return moduleName;
  62. }
  63. public String getAuthor() {
  64. return author;
  65. }
  66. public String getEmail() {
  67. return email;
  68. }
  69. public String getTablePrefix() {
  70. return tablePrefix;
  71. }
  72. public Set<String> getIgnores() {
  73. return ignores;
  74. }
  75. public List<String> getTemplates() {
  76. return templates;
  77. }
  78. public Map<String, String> getDataTypeConvert() {
  79. return dataTypeConvert;
  80. }
  81. public void setPackageName(String packageName) {
  82. this.packageName = packageName;
  83. }
  84. public void setModuleName(String moduleName) {
  85. this.moduleName = moduleName;
  86. }
  87. public void setAuthor(String author) {
  88. this.author = author;
  89. }
  90. public void setEmail(String email) {
  91. this.email = email;
  92. }
  93. public void setTablePrefix(String tablePrefix) {
  94. this.tablePrefix = tablePrefix;
  95. }
  96. public void setIgnores(Set<String> ignores) {
  97. this.ignores = ignores;
  98. }
  99. public void setTemplates(List<String> templates) {
  100. this.templates = templates;
  101. }
  102. public void setDataTypeConvert(Map<String, String> dataTypeConvert) {
  103. this.dataTypeConvert = dataTypeConvert;
  104. }
  105. /**
  106. * @return the database
  107. */
  108. public String getDatabase() {
  109. return database;
  110. }
  111. /**
  112. * @param database the database to set
  113. */
  114. public void setDatabase(String database) {
  115. this.database = database;
  116. }
  117. /**
  118. * @return the textTypes
  119. */
  120. public Set<String> getTextTypes() {
  121. return textTypes;
  122. }
  123. /**
  124. * @param textTypes the textTypes to set
  125. */
  126. public void setTextTypes(Set<String> textTypes) {
  127. this.textTypes = textTypes;
  128. }
  129. }
3 测试代码生成GeneratorTest

暂时生成的zip中的文件是放在一个文件夹下,并未分包,可根据需要修改此逻辑

  1. //查询当前数据库的表列表
  2. public void list() {}
  3. // 某个表的详情
  4. public void detail() {}
  5. // 导出某个或者多个表生成的
  6. public void export() {}
4 生成的文件包含
  1. 实体依赖BaseEntity等

    1. public class DevelopPlan extends BaseEntity {}
  2. mybatis的xml,包含页面列查询,详情查询,新增,修改,删除等基本操作,参见BaseMapper接口

  3. mapper:依赖BaseMapper

    1. public interface DevelopPlanMapper extends BaseMapper<DevelopPlan> {
    2. }
  1. service依赖BaseService

    1. @Service
    2. public class DevelopPlanService extends BaseService<DevelopPlanMapper, DevelopPlan>{}
  1. controller依赖BaseController

    1. @RestController
    2. @RequestMapping("/develop/plan")
    3. public class DevelopPlanController extends BaseController<DevelopPlanService, DevelopPlan>{}

三 自动生成的starter的页面 , 使用thymeleaf编写,简单内置页面导出功能

后台管理地址:console.xuqiudong.cc

image-20210917162635503

本项目gitee源码地址

本项目主要生成的模板包括:mapper,mapper.xml, service, controller, 以及前端的list.html和form.html, 可以根据吱声需要 重写generator.templates下的模板文件


发表评论

目录