成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot代碼生成器,讓你釋放雙手,從此不用手擼代碼

新聞 前端
通常在開始開發項目的時候,首先會建立好數據庫相關表,然后根據表結構生成 Controller、Service、DAO、Model以及一些前端頁面。

 [[327501]]

前言

通常在開始開發項目的時候,首先會建立好數據庫相關表,然后根據表結構生成 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. */ 
  10. private String tableName; 
  11. /** 
  12. * 實體類名 
  13. */ 
  14. private String entityName; 
  15. /** 
  16. * 實體類名 首字母小寫 
  17. */ 
  18. private String lowerEntityName; 
  19. /** 
  20. * 表備注 
  21. */ 
  22. private String tableComment; 
  23. /** 
  24. * 表前綴 
  25. */ 
  26. private String prefix; 
  27. /** 
  28. * 功能描述 
  29. */ 
  30. private String function; 
  31.  
  32. /** 
  33. * 列名 
  34. */ 
  35. private String columnName; 
  36. /** 
  37. * 實體列名 
  38. */ 
  39. private String entityColumnName; 
  40. /** 
  41. * 列描述 
  42. */ 
  43. private String columnComment; 
  44.  
  45. /** 
  46. * 類型 
  47. */ 
  48. private String dataType; 
  49.  
  50. /** 
  51. * 自增 
  52. */ 
  53. private Object columnExtra; 
  54. /** 
  55. * 長度 
  56. */ 
  57. private Object columnLength; 
  58.  
  59. private List<AppGen> list; 
  60.  

獲取表列表:

  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<AppGen> 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<AppGen> list = dynamicQuery.nativeQueryPagingListModel(AppGen.class,pageable, nativeSql); 
  13. data = new PageBean<>(list, totalCount); 
  14. return Result.ok(data); 
SpringBoot代碼生成器,讓你釋放雙手,從此不用手擼代碼

制作模板

模板太多了,這里只以Controller模板為例,貼一下實現代碼,更多模板見源碼:

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

說白了其實就是傳遞參數,把一些可變的代碼片段使用${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<AppGen> 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(); 

生成邏輯還是很傻瓜的,后期會慢慢優化,比如根據字段類型生成不同的表單形式,可以自定義字段是否顯示等的。

小結

總的來說,還是比較容易上手的,相對于一些簡單的列表功能分分鐘擼出效果,開發一分鐘,喝茶一整天。當然對于一些復雜的效果,還是自己一一去實現,但這并不影響生成器的實用性。

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

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2015-08-25 15:54:17

程序員代碼生成器

2021-07-23 11:24:54

Create Inc開源G代碼生成器

2023-05-17 16:02:00

CSS工具代碼生成器

2021-05-08 17:51:45

IDEA插件代碼

2023-01-06 07:52:52

代碼生成器開發

2021-03-05 17:07:41

工具在線代碼

2020-10-20 09:53:11

代碼IDEA生成器

2021-10-29 11:25:41

代碼編程語言Java

2012-03-30 09:31:44

WEBCSS

2021-12-10 09:45:19

生成器配置代碼

2024-07-09 08:49:56

2017-03-20 17:49:21

Java Web模板代碼

2011-08-16 10:17:12

XCode模版引擎XTemplate

2015-04-22 09:36:27

JAVA代碼生成器

2020-04-30 21:40:14

C#特性編程語言

2022-05-19 14:57:30

CSS代碼工具

2009-07-03 09:29:24

KeelKit

2022-03-10 10:48:30

PolyCoder自動代碼生成器語言

2010-03-26 13:03:23

Boost.Pytho

2025-01-08 08:00:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美精品 | 亚洲啊v在线 | 国产精品视频播放 | 91麻豆精品国产91久久久更新资源速度超快 | 青青久久av北条麻妃海外网 | 日韩在线一区二区三区 | 免费观看www | 国产精品毛片一区二区在线看 | 天堂免费| 亚洲视频免费在线播放 | 在线观看视频福利 | 羞羞网站在线观看 | 九九亚洲 | 成人精品一区亚洲午夜久久久 | 精品欧美一区二区精品久久久 | 污视频免费在线观看 | 不卡一区二区三区四区 | 午夜精品一区二区三区免费视频 | 国产四区 | 综合国产 | 天天摸天天干 | 九九天堂网 | 免费精品| 在线播放一区二区三区 | 国产成人小视频 | 五月天婷婷综合 | 免费视频一区 | 成人免费黄色片 | 亚洲福利电影网 | 免费av在线| 亚洲国产免费 | 91色综合 | www.久久久久久久久久久久 | 一级毛片视频 | av大全在线观看 | 亚洲一区二区视频 | 久久久www成人免费精品 | 九九免费在线视频 | 午夜私人影院在线观看 | 国产日韩精品一区二区 | 日韩美av|