SpringBoot代码生成器,让你释放双手,从此不用手撸代码

前言

通常在开始开发项目的时候,首先会建立好数据库相关表,然后根据表结构生成 Controller、Service、DAO、Model以及一些前端页面。

站在用户的角度思考问题,与客户深入沟通,找到南江网站设计与南江网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、域名注册、网页空间、企业邮箱。业务覆盖南江地区。

如果开发前没有强制的约束,而每个程序员都有自己的编码习惯,最终会导致一个项目呈现出多种编码风格。再有就是一些CRUD的列表功能,基本是没啥挑战性的,纯粹苦力活,浪费时间。

所以,根据公司现有框架,开发一款统一风格的代码生成器还是很有必要的。

技术选型

开发框架:SpringBoot+JPA,考虑到会生成各种前后端代码文件,这里我们选用freemarker模板引擎来制作相应的模板。

实现思路

获取表结构信息

首先我们定义一个实体类,为了使用方便,把表和字段信息放到了一个类中:

 
 
 
 
  1. /**
  2. * 表以及相关字段信息
  3. */
  4. @Data
  5. public class AppGen extends PageBean implements Serializable {
  6. /**
  7. * 表名
  8. */
  9. private String tableName;
  10. /**
  11. * 实体类名
  12. */
  13. private String entityName;
  14. /**
  15. * 实体类名 首字母小写
  16. */
  17. private String lowerEntityName;
  18. /**
  19. * 表备注
  20. */
  21. private String tableComment;
  22. /**
  23. * 表前缀
  24. */
  25. private String prefix;
  26. /**
  27. * 功能描述
  28. */
  29. private String function;
  30. /**
  31. * 列名
  32. */
  33. private String columnName;
  34. /**
  35. * 实体列名
  36. */
  37. private String entityColumnName;
  38. /**
  39. * 列描述
  40. */
  41. private String columnComment;
  42. /**
  43. * 类型
  44. */
  45. private String dataType;
  46. /**
  47. * 自增
  48. */
  49. private Object columnExtra;
  50. /**
  51. * 长度
  52. */
  53. private Object columnLength;
  54. private List list;
  55. }

获取表列表:

 
 
 
 
  1. @Override
  2. @Transactional(readOnly = true)
  3. public Result list(AppGen gen){
  4. String countSql = "SELECT COUNT(*) FROM information_schema.tables ";
  5. countSql +="WHERE table_schema='tools'";
  6. Long totalCount = dynamicQuery.nativeQueryCount(countSql);
  7. PageBean data = new PageBean<>();
  8. if(totalCount>0){
  9. String nativeSql = "SELECT table_name as tableName,table_comment as tableComment ";
  10. nativeSql+="FROM information_schema.tables WHERE table_schema='tools'";
  11. Pageable pageable = PageRequest.of(gen.getPageNo(),gen.getPageSize());
  12. List list = dynamicQuery.nativeQueryPagingListModel(AppGen.class,pageable, nativeSql);
  13. data = new PageBean<>(list, totalCount);
  14. }
  15. return Result.ok(data);
  16. }

制作模板

模板太多了,这里只以Controller模板为例,贴一下实现代码,更多模板见源码:

 
 
 
 
  1. package com.tools.module.${prefix}.web;
  2. import com.tools.common.config.AbstractController;
  3. import com.tools.common.model.Result;
  4. import com.tools.module.${prefix}.entity.${entityName};
  5. import com.tools.module.${prefix}.service.${entityName}Service;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RequestBody;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. @RestController
  12. @RequestMapping("/${prefix}/${function}")
  13. public class ${entityName}Controller extends AbstractController {
  14. @Autowired
  15. private ${entityName}Service ${function}Service;
  16. /**
  17. * 列表
  18. */
  19. @PostMapping("/list")
  20. public Result list(${entityName} ${function}){
  21. return ${function}Service.list(${function});
  22. }
  23. /**
  24. * 查询
  25. */
  26. @PostMapping("/get")
  27. public Result get(Long id){
  28. return ${function}Service.get(id);
  29. }
  30. /**
  31. * 保存
  32. */
  33. @PostMapping("/save")
  34. public Result save(@RequestBody ${entityName} ${function}){
  35. return ${function}Service.save(${function});
  36. }
  37. /**
  38. * 删除
  39. */
  40. @PostMapping("/delete")
  41. public Result delete(Long id){
  42. return ${function}Service.delete(id);
  43. }
  44. }

说白了其实就是传递参数,把一些可变的代码片段使用${name}形式编写。

代码生成

有点长,慢慢看,其实就是渲染各种前后端模板:

 
 
 
 
  1. /**
  2. * 生成代码
  3. * @param gen
  4. * @return
  5. * @throws IOException
  6. * @throws TemplateException
  7. */
  8. @PostMapping("/create")
  9. public Result create(@RequestBody AppGen gen) throws IOException, TemplateException {
  10. /**
  11. * 获取表字段以及注释
  12. */
  13. List list = genService.getByTable(gen);
  14. String name = gen.getTableName();
  15. String[] table = StringUtils.split(name,"_");
  16. gen.setPrefix(table[0]);
  17. gen.setFunction(table[1]);
  18. gen.setEntityName(GenUtils.allInitialCapital(gen.getTableName()));
  19. list.stream().forEach(column-> {
  20. column.setEntityColumnName(GenUtils.secInitialCapital(column.getColumnName()));
  21. });
  22. gen.setList(list);
  23. String baseFile = filePath+ SystemConstant.SF_FILE_SEPARATOR+"com"+
  24. SystemConstant.SF_FILE_SEPARATOR+ "tools"+
  25. SystemConstant.SF_FILE_SEPARATOR+ "module"+
  26. SystemConstant.SF_FILE_SEPARATOR+ gen.getPrefix()+SystemConstant.SF_FILE_SEPARATOR;
  27. /**
  28. * 后端代码
  29. */
  30. File entityFile = FileUtil.touch(baseFile+"entity"+
  31. SystemConstant.SF_FILE_SEPARATOR+gen.getEntityName()+".java");
  32. File repositoryFile = FileUtil.touch(baseFile+"repository"+
  33. SystemConstant.SF_FILE_SEPARATOR+gen.getEntityName()+"Repository.java");
  34. File serviceFile = FileUtil.touch(baseFile+"service"+
  35. SystemConstant.SF_FILE_SEPARATOR+gen.getEntityName()+"Service.java");
  36. File serviceImplFile = FileUtil.touch(baseFile+"service"+
  37. SystemConstant.SF_FILE_SEPARATOR+"impl"+SystemConstant.SF_FILE_SEPARATOR+
  38. gen.getEntityName()+"ServiceImpl.java");
  39. File controllerFile = FileUtil.touch(baseFile+"web"+
  40. SystemConstant.SF_FILE_SEPARATOR + gen.getEntityName() + "Controller.java");
  41. /**
  42. * 前端代码
  43. */
  44. String htmlPath = filePath+
  45. SystemConstant.SF_FILE_SEPARATOR + "templates"+
  46. SystemConstant.SF_FILE_SEPARATOR + gen.getPrefix()+
  47. SystemConstant.SF_FILE_SEPARATOR + gen.getFunction()+SystemConstant.SF_FILE_SEPARATOR;
  48. File listFile = FileUtil.touch(htmlPath + "list.html");
  49. File formFile = FileUtil.touch(htmlPath + "form.html");
  50. /**
  51. * 生成静态页面
  52. */
  53. Template template = configuration.getTemplate("html/list.ftl");
  54. String text = FreeMarkerTemplateUtils.processTemplateIntoString(
  55. template, gen);
  56. FileUtil.writeString(text,listFile,"UTF-8");
  57. template = configuration.getTemplate("html/form.ftl");
  58. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  59. template, gen);
  60. FileUtil.writeString(text,formFile,"UTF-8");
  61. /**
  62. * 生成后端代码 repository
  63. */
  64. template = configuration.getTemplate("java/repository.ftl");
  65. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  66. template, gen);
  67. FileUtil.writeString(text,repositoryFile,"UTF-8");
  68. /**
  69. * 生成后端代码 entity
  70. */
  71. template = configuration.getTemplate("java/entity.ftl");
  72. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  73. template, gen);
  74. FileUtil.writeString(text,entityFile,"UTF-8");
  75. /**
  76. * 生成后端代码 service
  77. */
  78. template = configuration.getTemplate("java/service.ftl");
  79. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  80. template, gen);
  81. FileUtil.writeString(text,serviceFile,"UTF-8");
  82. /**
  83. * 生成后端代码 service 实现
  84. */
  85. template = configuration.getTemplate("java/serviceImpl.ftl");
  86. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  87. template, gen);
  88. FileUtil.writeString(text,serviceImplFile,"UTF-8");
  89. /**
  90. * 生成后端代码 controller 实现
  91. */
  92. template = configuration.getTemplate("java/controller.ftl");
  93. text = FreeMarkerTemplateUtils.processTemplateIntoString(
  94. template, gen);
  95. FileUtil.writeString(text,controllerFile,"UTF-8");
  96. return Result.ok();
  97. }

生成逻辑还是很傻瓜的,后期会慢慢优化,比如根据字段类型生成不同的表单形式,可以自定义字段是否显示等的。

小结

总的来说,还是比较容易上手的,相对于一些简单的列表功能分分钟撸出效果,开发一分钟,喝茶一整天。当然对于一些复杂的效果,还是自己一一去实现,但这并不影响生成器的实用性。

源码
https://gitee.com/52itstyle/SPTools

本文标题:SpringBoot代码生成器,让你释放双手,从此不用手撸代码
网站URL:http://www.shufengxianlan.com/qtweb/news24/25974.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联