知识库代码(知识库网站)一篇读懂
知识库系列:手把手教你开发一套代码生成器,学不会的来怼我!准备面试?工作遇到问题?想要积累知识?快来7TCoding搜一搜。不积跬步,无以至千里不积小流,无以成江海。生活中总有些东西值得分享。
底部有惊喜,关注更多精彩不积跬步,无以至千里不积小流,无以成江海生活中总有些东西值得分享整理 | 7TCoding ; 策划 | 小七
由于公众号改版,为了不错过精彩内容,大家一定要把我们星标哦!一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说已经完全写吐了,至少我就是这种类型的。
但是呢,不可否认,绝大多数的软件功能,向下追随到最基本的单元,也基本都是单表的增、删、改、查!只是随着用户需求不断增多,原来可能一个张单表就可以搞定的事情,现在可能需要多张表,或者多个库才能搞定,代码层就像堆积木一样,越堆越复杂。
我记得早期做项目的时候,项目每新加一张单表,我都需要在代码层,按照MVC框架的思想,重新编写一套CURD的代码,写完所有的基础的增删改查,至少需要20分钟,手快的情况下,最快也要10分钟假如某个新开发的功能,要新增10张表,按照这个时间计算,至少要100分钟,仔细想想,其实你会发现大部分的时间都浪费在这些简单而又重复的编程圈子中去了。
那有没有一个办法,将这些简单的CURD代码,全部都标准化、公共化呢?这样我们的可以省下很多时间来投入业务场景的开发答案是肯定的,有!我记得早期我最先接触的是MybatisGenertor工具包,通过这个工具包,我们可以省去大部分的。
mybaits中xml文件的curd编写工作还有我们所熟悉的JPA,里面有一套公共的持久层动态代理类,它可以自动根据名称生成SQL语句,能为开发省下不少的事情但是我这个人比较懒,我想搞一个工具,从controller
、service、entity 、dao层,全部的crud代码,包括单元测试类,通过工具自动生成好像这样的工具,现在网上也有不少,例如我们所熟悉的Mybatis-plus插件,它就可以做到这一点,也是非常好用。
但是有的公司就不喜欢它,原因也很简单,里面的很多公共方法封装的过于深入,而且很多crud的sql全部都是动态生成,你根本看不到总之啊就是一句,不在自己掌控之内的,很多程序员总是带着各种疑虑~~当然,还有一个明显的疑虑,就是对微服务的开发,不能全面支持,比如你项目采用的是。
SpringBoot +Dubbo组合来开发,这个时候生成的controller,完全没啥用处,而且还很鸡肋因此在这种情况下,你得基于当前的项目软件开发规则,自己开发一套代码生成器,以满足快速开发的需要。
下面我就简单的介绍一下,如何自行开发一套代码生成器,过程如下!二、代码实践其实开发一套代码生成器,真没大家想象中的那么复杂,其中用的最重要一项技术,就是利用模板来生成代码,例如我们经常使用的模板引擎freemarker
,它就可以帮助我们实现这一点2.1、首先我们添加 freemarker 依赖包 org.freemarker freemarker。
2.3.232.2、然后创建一个代码模版下面我们以动态创建实体类为例,编写一个实体类的模板entity.java.ftl,其中${}
里面定义的是动态变量package ${package};import java.io.Serializable;/** *
* ${tableComment} *
* * @author。${author} * @since ${date} */publicclass ${entityClass} implements Serializable {privatestaticfinallong
serialVersionUID = 1L; /** * ${pro.comment} */private
${pro.propertyType} ${pro.propertyName};
public ${pro.propertyType} get${pro.propertyName?cap_first}() {returnthis.${pro.propertyName}; }public
${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) {this.${pro.propertyName} = ${pro.propertyName};
returnthis; } }2.3、最后生成目标代码最后我们基于freemarker编写一个测试类!publicclassCodeGeneratorDemo{publicstatic
voidmain(String[] args)throws IOException, TemplateException { Map objectMap =
new HashMap<>();//定义包路径 objectMap.put("package", "com.example.test");//定义实体类 objectMap.put(
"entityClass", "Student");//定义实体类属性 List columns = new ArrayList<>();//姓名字段
Map column1 = new HashMap<>(); column1.put("propertyType", "String"); column1.put(
"propertyName", "name"); column1.put("comment", "姓名"); columns.add(column1);//年龄字段 Map column2 =
new HashMap<>(); column2.put("propertyType", "Integer"); column2.put("propertyName", "age"
); column2.put("comment", "年龄"); columns.add(column2);//定义类的属性 objectMap.put("columns"
, columns);//定义作者 objectMap.put("author", "张三");//定义创建时间 objectMap.put("date", new SimpleDateFormat(
"yyyy-MM-dd").format(new Date()));//定义类描述 objectMap.put("tableComment", "学生信息");//生产目标代码 Configuration configuration =
new Configuration(Configuration.VERSION_2_3_23); configuration.setDefaultEncoding(Charset.forName(
"UTF-8").name()); configuration.setClassForTemplateLoading(CodeGeneratorDemo.class, "/"); Template template = configuration.getTemplate(
"/templates/entity.java.ftl"); FileOutputStream fileOutputStream = new FileOutputStream(new File(
"../src/main/java/com/example/generator/Student.java")); template.process(objectMap, new OutputStreamWriter(fileOutputStream, Charset.forName(
"UTF-8").name())); fileOutputStream.close(); System.out.println("文件创建成功"); }}运行程序,输出的文件结果如下!
package com.example.test;import java.io.Serializable;/** *
* 学生信息 *
* * @author 张三 * @since 2021-08-22*/publicclassStudentimplementsSerializable{privatestaticfinallong serialVersionUID = 1L;/** * 姓名
*/private String name;/** * 年龄 */private Integer age;public String getName(){returnthis.name;
}public Student setName(String name){this.name = name;returnthis; }public Integer getAge(){return
this.age; }public Student setAge(Integer age){this.age = age;returnthis; }}与预期的效果一致,成功生成!以上就是生成代码最核心的部分,首先编写一套模板,把需要填充的信息全部定义成动态变量,然后在代码中,通过map数据格式,使用
freemarker进行填充!例如小编我就是采用这种方式,首先把要通过工具生成的代码,全部通过模板方式定义好。
然后通过连接数据库的方式,把需要自动生成的表结构查询出来,封装成数据渲染参数,最后传入到freemarker中去,非常简单、快速的生成与自己预期想要的代码,所有单表的crud全部一步到位!下面这个就是小编,基于当前项目定制开发的一款代码生成器,项目采用
SpringBoot + Dubbo框架开发,没有Controller层,截图中所有的代码全部都是采用代码生成器生成的,直接通过单元测试就可以运行,开发的时候非常快!
由于开发的代码生成器工具,代码有点过多,因此不便于通过文章分享给大家,有需要的朋友,可以访问如下链接获取:https://github.com/justdojava/springboot-example-generator
三、小结代码生成器,对于擅长以业务开发为主的程序员来说,绝对是一个巨大的福利,它能很明显的减轻开发人员的工作量,并且提升开发效率,能腾出更多的时间专注业务开发实际上,目前网上已经有很多的成熟、稳定的代码生成器,。
mybatis-plus就是其中一个使用非常广泛的代码生成器,对于以单体web开发为主的项目,它完全满足要求当然,如果当下你没有合适的代码生成器,不妨自己试试开发一款属于自己的代码生成器,同样也可以加倍提升开发效率。
四、参考1、MyBatis-Plus 文档你学废了吗准备面试?工作遇到问题?想要积累知识?快搜索公众号:7TCoding
往期内容回顾:1、互联网知识库合集【详见脑图】2、知识库系列:Zookeeper和Mybatis(持续更新)3、知识库系列:Dubbo(附脑图-持续更新)4、知识库系列:分布式搜索和分析引擎Elasticsearch(附脑图-持续更新)
5、知识库系列:Redis(附脑图-持续更新)6、知识库系列:分布式的高速缓存系统Memcached(附脑图-持续更新)7、知识库系列:MySQL(附脑图-持续更新)8、知识库系列:Java基础1+2(附脑图-持续更新)
9、知识库系列:SpringBoot干货实践及知识库(附脑图-持续更新)10、知识库系列:Linux知识库(附脑图-持续更新)11、知识库系列:微服务系列(附脑图-持续更新)12、知识库系列:Spring 知识库(一)(附脑图-持续更新)
13、知识库系列:5万长文Java知识Java3+4(附脑图-持续更新)14、知识库系列:Spring Cloud (附脑图-持续更新)15、知识库系列:异常、网络和部分设计模式知识库(持续更新)16、
知识库系列:RabbitMQ(持续更新)17、知识库系列:分布式十二问!万字图文详解!(持续更新)18、知识库系列:谁能真正替代你?AI编码工具深度对比 (chatGPT/Copilot/Cursor/New Bing)
19、知识库系列:太牛比了!i/o timeout 的全解思路及实战, 希望你不要踩到这个net/http包的坑(持续更新)20、知识库系列:对标大厂的技术派架构设计(持续更新)21、知识库系列:一文看懂零售行业数据分析的五大场景:商品、门店、库存、活动、会员(持续更新)
22、知识库系列:8大好用的数据迁移工具,真的太方便了!(持续更新)23、知识库系列:从实现到原理,聊聊Java中的SPI动态扩展(持续更新)24、如果今年面试难,建议先上岸再说【200多家IT软件外包公司汇总】
25、知识库系列:某大厂的DDD实践,给出落地的示例(持续更新)26、知识库系列:OAuth2.0授权码模式原理与实战(持续更新)27、知识库系列:mysql的varchar字段最大长度真的是65535吗?(持续更新)
28、知识库系列:我用chatGPT造了“模特”(持续更新)29、知识库系列:MySQL索引,快速记忆法30、知识库系列:用户转化行为,该如何进行分析?31、知识库系列:五种最常见加密算法!你见过几个?
32、知识库系列:18张图,详解SpringBoot解析yml全流程33、知识库系列:明明加了唯一索引,为什么还是产生重复数据?34、知识库系列:面试官:为什么JDK动态代理只能代理接口?35、知识库系列:手把手教你申请微软 Azure OpenAI 全教程
36、持续更新中......更多精彩,请加入我们哦!
添加小编微信,拉你进群哦
免责声明:有部分内容来自网络,版权归原作者所有,禁止用于商业用途,对转载、分享的内容、陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完善性提供任何明示或暗示的保证,仅供读者学习参考之用,如有侵犯机构、媒体、公司 、企业或个人等的知识产权,请联系删除,本公众平台将不承担任何责任。
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186