当前位置: 首页 > 科技观察

教你开发代码生成器,学不会来找我!

时间:2023-03-16 01:09:27 科技观察

1。Introduction在实际的软件项目开发过程中,我可以很负责任的告诉你,如果你真的写过5年以上的代码,那么简单的增删改查这些简单的功能需求,你需要什么?开发,可以说是完全写到吐了,至少我是这种类型的。但不可否认的是,软件的绝大多数功能,下到最基本的单元,基本上都是单表的增删改查!但是随着用户需求的不断增加,以前可能单表可以做的事情现在可能需要多表或者多库。代码层就像积木一样,越堆越复杂。记得早期做项目的时候,项目中每新增一个单表,都需要按照MVC框架的思想在代码层重写一套CURD代码,完成所有基本的增删改查,至少需要20分钟,手快的话最快10分钟。如果一个新开发的功能需要增加10张表,按这个时间计算至少需要100分钟。仔细想想,你会发现大部分时间都浪费在这些简单重复的编程圈子里了。向上。有没有办法标准化和宣传所有这些简单的CURD代码?这样一来,我们就可以节省大量的时间投入到业务场景的开发上。答案是肯定的,是的!记得早期最先接触到的就是MybatisGenertor工具包。通过这个工具包,我们可以在mybaits中省去大部分xml文件的curd编写工作。还有就是我们熟悉的JPA,它有一套公共的持久层动态代理类,可以根据名称自动生成SQL语句,可以为开发省去很多事情。但是我是个懒人,想做一个工具,从controller,service,entity,dao层,所有的crud代码,包括单元测试类,都可以通过工具自动生成。像这样的工具在网上也有,比如我们熟悉的Mybatis-plus插件,就可以做到这一点,而且也非常好用。但是有的公司不喜欢,原因很简单。里面很多public方法封装的太深,很多crudSQL都是动态生成的,根本看不到。总之就是一句话,很多程序员总是对不受自己控制的事情有各种疑惑~~当然还有一个明显的疑惑,那就是不能完全支持微服务的开发。比如你的项目使用SpringBoot+Dubbo开发。这时候生成的controller是完全没用没味道的。所以,在这种情况下,你就不得不根据目前的项目软件开发规律,自己开发一套代码生成器,以满足快速开发的需要。下面简单介绍一下如何自己开发一个代码生成器。过程如下!2.代码实践其实开发一个代码生成器并没有大家想象的那么复杂。其中用到的最主要的技术就是使用模板来生成代码,比如我们经常使用的模板引擎freemarker,就可以帮助我们实现这一点。2.1.首先我们添加freemarker依赖包org.freemarkerfreemarker2.3.232.2,然后创建代码template下面我们以动态创建实体类为例,编写一个实体类模板entity.java.ftl,其中${}定义了动态变量。package${package};importjava.io.Serializable;/***

*${tableComment}*

**@author${author}*@since${date}*/publicclass${entityClass}implementsSerializable{privatestaticfinallongserialVersionUID=1L;<#--属性遍历--><#listcolumnsaspro>/***${pro.comment}*/private${pro.propertyType}${pro.propertyName};<#--属性获取||设置方法--><#listcolumnsaspro>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{publicstaticvoidmain(String[]args)throwsIOException,TemplateException{MapobjectMap=newHashMap<>();//定义包路径objectMap。put("package","com.example.test");//定义实体类objectMap.put("entityClass","Student");//定义实体类属性List>columns=newArrayList<>();//命名字段Mapcolumn1=newHashMap<>();column1.put("propertyType","String");column1.put("propertyName","name");column1.put("comment","name");columns.add(column1);//年龄字段Mapcolumn2=newHashMap<>();column2.put("propertyType","Integer");column2.put("propertyName","age");column2.put("comment","age");列。add(column2);//定义类的属性objectMap.put("columns",columns);//定义作者objectMap.put("author","张三");//定义创建时间objectMap.put("date",newSimpleDateFormat("yyyy-MM-dd").format(newDate()));//定义类描述objectMap.put("tableComment","学生信息");//生产目标代码配置configuration=newConfiguration(Configuration.VERSION_2_3_23);配置.setDefaultEncoding(Charset.forName("UTF-8").name());configuration.setClassForTemplateLoading(CodeGeneratorDemo.class,"/");Templatetemplate=configuration.getTemplate("/templates/entity.java.ftl");FileOutputStreamfileOutputStream=newFileOutputStream(newFileOutputStream)(("../src/main/java/com/example/generator/Student.java"));template.process(objectMap,newOutputStreamWriter(fileOutputStream,Charset.forName("UTF-8").name()));fileOutputStream.close();System.out.println("文件创建成功");}}运行程序,输出文件结果如下!packagecom.example.test;importjava.io.Serializable;/***

*学生信息*

**@author张三*@since2021-08-22*/publicclassStudentimplementsSerializable{privatestaticfinallongserialVersionUID=1L;/***姓名*/privateStringname;/***age*/privateIntegerage;publicStringgetName(){returnthis.name;}publicStudentsetName(Stringname){this.name=name;returnthis;}publicIntegergetAge(){returnthis.age;}publicStudentsetAge(Integerage){this.age=age;returnthis;}}是一致的w预期效果,成功生成!以上是生成代码的核心部分。首先写一套模板,将所有需要填充的信息定义为动态变量,然后使用freemarker通过地图数据格式填充代码!比如我是这样的,首先通过模板定义所有工具要生成的代码,然后通过连接数据库查询需要自动生成的表结构,封装成数据渲染参数,最后传入freemarker,非常简单和快速地生成您期望和想要的代码,并且单个表的所有crud一步到位!下面是一个小编辑器,基于当前项目定制开发的代码生成器。项目采用SpringBoot+Dubbo框架开发。没有Controller层,截图中的所有代码都是代码生成器生成的,可以直接通过单元测试运行,开发速度非常快!由于自己开发的代码生成工具,代码有点多,不太好通过文章分享给大家,有需要的朋友可以访问以下链接获取:https://github。com/justdojava/springboot-example-generator3.总结代码生成器,对于擅长业务开发的程序员来说,绝对是一个巨大的福利,它可以明显减少开发人员的工作量,提高开发效率,腾出更多的时间来专注关于业务发展。其实网上已经有很多成熟稳定的代码生成器了。Mybatis-plus是应用广泛的代码生成器之一。完全满足以单体web开发为主的项目需求。当然,如果你暂时没有合适的代码生成器,不妨尝试开发自己的代码生成器,同样可以使开发效率成倍提高。4.参考1.MyBatis-Plus文档