当前位置:

首页 > 编程开发 > SpringBoot怎么整合freemarker实现代码生成器

SpringBoot怎么整合freemarker实现代码生成器

一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说已经完全写吐了,至少我就是这种类型的。但是呢,不可否认,绝大多数的软件功能,向下追随到最基本的单元,也基本都是单表的增、删、改、查!只是随着用户需求不断增多,原来可能一个张单表就可以搞定的事情,现在可能需要多张表,或者多个库才能搞定,代码层就像堆积木一样,越堆越复杂。我记得早期做项目的时候,项目每新加一张单表,我都需要在代码层,按照MVC框架的思想,重新编写一套CUR

本文目录

      一、介绍

      在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过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.23
      

      2.2、然后创建一个代码模版

      下面我们以动态创建实体类为例,编写一个实体类的模板entity.java.ftl,其中${}里面定义的是动态变量。

      package ${package};
      
      import java.io.Serializable;
      
      /**
       * 

       * ${tableComment}  * 

       *  * @author ${author}  * @since ${date}  */ public class ${entityClass} implements Serializable {     private static final long serialVersionUID = 1L;          <#--属性遍历-->     <#list columns as pro>     /**      * ${pro.comment}      */     private ${pro.propertyType} ${pro.propertyName};          <#--属性get||set方法-->     <#list columns as pro>     public ${pro.propertyType} get${pro.propertyName?cap_first}() {         return this.${pro.propertyName};     }     public ${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) {         this.${pro.propertyName} = ${pro.propertyName};         return this;     }      }

      2.3、最后生成目标代码

      最后我们基于freemarker编写一个测试类!

      public class CodeGeneratorDemo {
      
          public static void main(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  */ public class Student implements Serializable {     private static final long serialVersionUID = 1L;          /**      * 姓名      */     private String name;     /**      * 年龄      */     private Integer age;     public String getName() {         return this.name;     }     public Student setName(String name) {         this.name = name;         return this;     }     public Integer getAge() {         return this.age;     }     public Student setAge(Integer age) {         this.age = age;         return this;     } }

      与预期的效果一致,成功生成!

      例如小编我就是采用这种方式,首先把要通过工具生成的代码,全部通过模板方式定义好。

      SpringBoot怎么整合freemarker实现代码生成器

      然后通过连接数据库的方式,把需要自动生成的表结构查询出来,封装成数据渲染参数,最后传入到freemarker中去,非常简单、快速的生成与自己预期想要的代码,所有单表的crud全部一步到位!

      下面这个就是小编,基于当前项目定制开发的一款代码生成器,项目采用SpringBoot + Dubbo框架开发,没有Controller层,截图中所有的代码全部都是采用代码生成器生成的,直接通过单元测试就可以运行,开发的时候非常快!

      SpringBoot怎么整合freemarker实现代码生成器

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发
      相关文章 更多
      springBoot项目常用目录有哪些
      springBoot项目常用目录有哪些

      springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

      解析SpringBoot和SpringMVC之间的异同
      解析SpringBoot和SpringMVC之间的异同

      解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

      探索SpringCloud和SpringBoot在微服务领域的不同应用方式
      探索SpringCloud和SpringBoot在微服务领域的不同应用方式

      近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

      SpringBoot和SpringMVC有何区别?
      SpringBoot和SpringMVC有何区别?

      SpringBoot与SpringMVC的不同之处在哪里?SpringBoot和SpringMVC是两个非常流行的Java开发框架,用于构建Web应用程序。尽管它们经常分别被使用,但它们之间的不同之处也是很明显的。首先,SpringBoot可以被看作是一个Spring框架的扩展或者增强版。它旨在简化Spring应用程序的初始化和配置过程,以帮助开发人

      比较SpringBoot和SpringMVC的异同
      比较SpringBoot和SpringMVC的异同

      SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

      SpringBoot与SpringMVC的不同点是什么?
      SpringBoot与SpringMVC的不同点是什么?

      SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。一、SpringBoot的特点:简化配置:SpringBoot通过约定优于配置的原则,大大简化了项目的配置过程。它可以自动配置项目所需要的参数,开发人

      比较和选择指南:SpringCloud与SpringBoot的功能比较
      比较和选择指南:SpringCloud与SpringBoot的功能比较

      SpringCloud和SpringBoot是目前Java领域中最热门的开源框架,它们分别提供了一套完善的微服务架构和快速构建应用程序的解决方案。本文将对它们的功能进行比较,并给出选择指南,以帮助读者了解它们的优势和适用场景。SpringBoot是一个用于开发Java应用程序的框架,它提供了一个简化的开发流程,集成了大量常用的功能和组件,减少了开发者的工作量

      SpringCloud与SpringBoot:分析它们之间的相似与不同
      SpringCloud与SpringBoot:分析它们之间的相似与不同

      深入剖析SpringCloud和SpringBoot的异同引言:在构建企业级应用程序时,Spring框架已经成为开发者们的首选。它提供了一种简单而强大的方式来构建独立于平台的应用程序。Spring框架由两个核心模块组成:SpringBoot和SpringCloud。虽然它们都可以帮助开发者快速搭建应用程序,但它们的目标和用途存在一些差异。本文将深入剖析Spr

      从架构角度看SpringCloud与SpringBoot的差异
      从架构角度看SpringCloud与SpringBoot的差异

      从架构角度看SpringCloud与SpringBoot的差异引言:在当今的互联网时代,构建分布式系统已经成为了一种必要的需求。而SpringBoot和SpringCloud正是为了满足这个需求而诞生的。尽管它们都是由Spring框架所提供的解决方案,但从架构角度来看,它们存在着一些重要的差异。本文将从架构的角度出发,对SpringBoot和SpringCl

      Java API 开发中使用 SpringBoot 的利弊分析
      Java API 开发中使用 SpringBoot 的利弊分析

      JavaAPI开发中使用SpringBoot的利弊分析随着互联网的快速发展和技术的不断更新迭代,Java技术在开发中的广泛应用引起了人们的重视。而SpringBoot作为一种微服务架构的解决方案,已经逐渐成为Java开发中的热门选择。那么,在JavaAPI开发中使用SpringBoot,到底有哪些利弊呢?下面来分析一下。利:简化开发

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。