Heim  >  Artikel  >  Java  >  Wie SpringBoot Freemarker integriert, um den Codegenerator zu implementieren

Wie SpringBoot Freemarker integriert, um den Codegenerator zu implementieren

WBOY
WBOYnach vorne
2023-05-10 20:37:101228Durchsuche

    1. Einführung

    Im eigentlichen Softwareprojektentwicklungsprozess kann ich Ihnen sehr verantwortungsvoll sagen, ob Sie tatsächlich haben Wenn Sie mehr als 5 Jahre lang Code geschrieben haben, können Sie sagen, dass Sie Ihre Fähigkeit, einfache funktionale Anforderungen wie Hinzufügen, Löschen, Ändern und Überprüfen zu entwickeln, völlig verloren haben. Zumindest bin ich dieser Typ.

    Es ist jedoch unbestreitbar, dass die überwiegende Mehrheit der Softwarefunktionen, bis hin zur grundlegendsten Einheit, im Wesentlichen das Hinzufügen, Löschen, Ändern und Abfragen einer einzelnen Tabelle sind!

    Es ist nur so, dass Dinge, die in der Vergangenheit möglicherweise mit einer einzelnen Tabelle erledigt wurden, jetzt möglicherweise mehrere Tabellen oder mehrere Bibliotheken erfordern. Die Codeebenen ähneln dem Stapeln von Blöcken komplex es ist.

    Ich erinnere mich, als ich in den frühen Tagen Projekte durchführte, musste ich jedes Mal, wenn ich dem Projekt eine einzelne Tabelle hinzufügte, einen Satz auf Codeebene entsprechend der Idee neu schreiben Der Code des <code>MVC-Frameworks benötigt mindestens 20 Minuten, um alle grundlegenden Ergänzungen, Löschungen, Änderungen und Suchvorgänge zu schreiben Höchstens 10 Minuten. MVC框架的思想,重新编写一套CURD的代码,写完所有的基础的增删改查,至少需要20分钟,手快的情况下,最快也要10分钟。

    假如某个新开发的功能,要新增10张表,按照这个时间计算,至少要100分钟,仔细想想,其实你会发现大部分的时间都浪费在这些简单而又重复的编程圈子中去了。

    那有没有一个办法,将这些简单的CURD代码,全部都标准化、公共化呢?这样我们的可以省下很多时间来投入业务场景的开发。

    答案是肯定的,有!

    我记得早期我最先接触的是MybatisGenertor工具包,通过这个工具包,我们可以省去大部分的mybaitsxml文件的curd编写工作。

    还有我们所熟悉的JPA,里面有一套公共的持久层动态代理类,它可以自动根据名称生成SQL语句,能为开发省下不少的事情。

    但是我这个人比较懒,我想搞一个工具,从controllerserviceentity dao层,全部的crud代码,包括单元测试类,通过工具自动生成好。

    像这样的工具,现在网上也有不少,例如我们所熟悉的Mybatis-plus插件,它就可以做到这一点,也是非常好用。

    但是有的公司就不喜欢它,原因也很简单,里面的很多公共方法封装的过于深入,而且很多crudsql全部都是动态生成,你根本看不到。

    总之啊就是一句,不在自己掌控之内的,很多程序员总是带着各种疑虑~~

    当然,还有一个明显的疑虑,就是对微服务的开发,不能全面支持,比如你项目采用的是SpringBoot +Dubbo组合来开发,这个时候生成的controller,完全没啥用处,而且还很鸡肋。

    因此在这种情况下,你得基于当前的项目软件开发规则,自己开发一套代码生成器,以满足快速开发的需要。

    下面我就简单的介绍一下,如何自行开发一套代码生成器,过程如下!

    二、代码实践

    其实开发一套代码生成器,真没大家想象中的那么复杂,其中用的最重要一项技术,就是利用模板来生成代码,例如我们经常使用的模板引擎freemarker,它就可以帮助我们实现这一点。

    2.1、首先我们添加 freemarker 依赖包

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>

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

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

    package ${package};
    
    import java.io.Serializable;
    
    /**
     * <p>
     * ${tableComment}
     * </p>
     *
     * @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};
        </#list>
    
        <#--属性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;
        }
        </#list>
    }

    2.3、最后生成目标代码

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

    public class CodeGeneratorDemo {
    
        public static void main(String[] args) throws IOException, TemplateException {
            Map<String, Object> objectMap = new HashMap<>();
            //定义包路径
            objectMap.put("package", "com.example.test");
            //定义实体类
            objectMap.put("entityClass", "Student");
    
            //定义实体类属性
            List<Map<String, Object>> columns = new ArrayList<>();
            //姓名字段
            Map<String, Object> column1 = new HashMap<>();
            column1.put("propertyType", "String");
            column1.put("propertyName", "name");
            column1.put("comment", "姓名");
            columns.add(column1);
            //年龄字段
            Map<String, Object> 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;
    
    /**
     * <p>
     * 学生信息
     * </p>
     *
     * @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;
        }
    }

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

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

    Wie SpringBoot Freemarker integriert, um den Codegenerator zu implementieren

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

    下面这个就是小编,基于当前项目定制开发的一款代码生成器,项目采用SpringBoot + Dubbo框架开发,没有Controller

    Wenn eine neu entwickelte Funktion das Hinzufügen von 10 neuen Tabellen erfordert, dauert es basierend auf dieser Zeit mindestens 100 Minuten. Wenn Sie sorgfältig darüber nachdenken, werden Sie feststellen, dass die meiste Zeit verschwendet wird Diese einfachen Aufgaben begab ich mich in den repetitiven Programmierkreis.

    Wie SpringBoot Freemarker integriert, um den Codegenerator zu implementierenGibt es eine Möglichkeit, all diese einfachen CURD-Codes zu standardisieren und zu veröffentlichen? Auf diese Weise können wir viel Zeit sparen und in die Entwicklung von Geschäftsszenarien investieren.

    #🎜🎜#Die Antwort ist ja, ja! #🎜🎜##🎜🎜# Ich erinnere mich, dass das erste, mit dem ich in den frühen Tagen in Kontakt kam, das MybatisGenertor-Toolkit war. Mit diesem Toolkit können wir die meisten mybaits <code>curd Vorbereitung von Code>xml-Dateien. #🎜🎜##🎜🎜#Es gibt auch JPA, mit dem wir vertraut sind und das über eine Reihe dynamischer Proxy-Klassen der öffentlichen Persistenzschicht verfügt, die automatisch SQL-Anweisungen generieren können Basierend auf dem Namen kann es viel Arbeit für die Entwicklung sparen. #🎜🎜##🎜🎜#Aber ich bin ein fauler Mensch. Ich möchte ein Tool aus controller, service, entity , dao-Ebene werden alle crud-Codes, einschließlich Unit-Test-Klassen, automatisch von Tools generiert. #🎜🎜##🎜🎜#Es gibt mittlerweile viele solcher Tools im Internet, wie zum Beispiel das bekannte Plug-in Mybatis-plus, das dies kann und zudem sehr einfach zu bedienen ist. #🎜🎜##🎜🎜#Aber einige Unternehmen mögen es nicht. Der Grund ist auch sehr einfach. Viele öffentliche Methoden sind zu tief gekapselt und viele cruds Es wird alles dynamisch generiert und Sie können es überhaupt nicht sehen. #🎜🎜##🎜🎜#Kurz gesagt, es liegt nicht in ihrer Kontrolle. ~~#🎜🎜##🎜🎜# Natürlich gibt es noch einen weiteren offensichtlichen Zweifel: Die Entwicklung von Microservices ist nicht möglich Wenn Ihr Projekt beispielsweise mit einer Kombination aus SpringBoot + Dubbo entwickelt wird, ist der zu diesem Zeitpunkt generierte Controller völlig nutzlos und auch sehr geschmacklos . #🎜🎜##🎜🎜#In diesem Fall müssen Sie also Ihren eigenen Codegenerator basierend auf den aktuellen Regeln für die Softwareentwicklung des Projekts entwickeln, um den Anforderungen einer schnellen Entwicklung gerecht zu werden. #🎜🎜##🎜🎜# Jetzt werde ich kurz vorstellen, wie Sie selbst einen Codegenerator entwickeln. Der Prozess ist wie folgt! #🎜🎜##🎜🎜# 2. Code-Praxis #🎜🎜##🎜🎜#Tatsächlich ist die Entwicklung eines Codegenerators nicht so kompliziert, wie alle denken. Die wichtigste verwendete Technologie istdie Verwendung von Vorlagen zum Generieren von Code, wie zum Beispiel die von uns häufig verwendete Template-Engine freemarker, können uns dabei helfen, dies zu erreichen. #🎜🎜#

    2.1. Zuerst fügen wir das Freemarker-Abhängigkeitspaket hinzu

    rrreee

    2.2 und erstellen dann eine Codevorlage

    #🎜🎜# Nehmen wir die dynamische Erstellung von Entitätsklassen als Geben Sie ein Beispiel ein und schreiben Sie eine Vorlage für die Entitätsklasse entity.java.ftl, in der ${} dynamische Variablen definiert. #🎜🎜#rrreee

    2.3. Generieren Sie schließlich den Zielcode

    #🎜🎜#Schließlich schreiben wir eine Testklasse basierend auf freemarker! #🎜🎜#rrreee#🎜🎜#Führen Sie das Programm aus und die Ergebnisse der Ausgabedatei sind wie folgt! #🎜🎜#rrreee#🎜🎜#Der Effekt stimmt mit dem Erwarteten überein und wurde erfolgreich erzeugt! #🎜🎜##🎜🎜#Ich verwende zum Beispiel diese Methode. Zunächst werden alle vom Tool zu generierenden Codes über Vorlagen definiert. #🎜🎜##🎜🎜#Wie integriert SpringBoot Freemarker, um den Codegenerator zu implementieren#🎜🎜##🎜🎜# Fragen Sie dann durch Herstellen einer Verbindung zur Datenbank die Tabellenstruktur ab, die automatisch generiert werden muss, kapseln Sie sie in Datenrenderingparameter und übergeben Sie sie schließlich an freemarker ist sehr einfach. Generieren Sie schnell den gewünschten Code, und alle Einzeltabellen-crud können in einem Schritt fertiggestellt werden! #🎜🎜##🎜🎜#Das Folgende ist ein vom Herausgeber angepasster und entwickelter Codegenerator basierend auf dem aktuellen Projekt. Das Projekt wurde mit dem SpringBoot + Dubbo-Framework entwickelt und verfügt über keinen Controller Layer, alle Codes in den Screenshots werden mit dem Codegenerator generiert und können direkt durch Unit-Tests ausgeführt werden. Die Entwicklung ist sehr schnell! #🎜🎜##🎜🎜##🎜🎜##🎜🎜#

    Das obige ist der detaillierte Inhalt vonWie SpringBoot Freemarker integriert, um den Codegenerator zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen