찾다
Javajava지도 시간SpringBoot가 freemarker를 통합하여 코드 생성기를 구현하는 방법

    1. 소개

    실제 소프트웨어 프로젝트 개발 과정에서 실제로 5년 이상 코드를 작성해 본 분들이라면 추가, 삭제, 등 간단한 코드에 익숙하지 않으실 것이라고 책임감 있게 말씀드릴 수 있습니다. 수정, 질의 등 기능적 요구사항의 개발은 완전히 정해졌다고 할 수 있는데, 적어도 나는 이런 타입이다.

    그러나 가장 기본적인 단위까지 대부분의 소프트웨어 기능은 기본적으로 하나의 테이블에 대한 추가, 삭제, 수정, 쿼리라는 사실은 부인할 수 없습니다!

    단지 사용자의 요구가 계속 증가함에 따라 과거에는 단일 테이블로 수행할 수 있었던 작업이 이제 여러 테이블이나 여러 라이브러리가 필요할 수 있습니다. 코드 레이어는 블록을 쌓는 것과 같으며, 더 많이 쌓을수록 더 복잡해집니다.

    초창기 프로젝트를 진행하면서 프로젝트에 테이블 하나를 추가할 때마다 코드 레벨에서 CURD 세트를 코드에 따라 다시 작성해야 했던 기억이 납니다. MVC 프레임워크의 아이디어는 코드를 작성하는 데 기본 추가, 삭제, 수정 및 확인을 모두 작성하는 데 최소 20분이 소요될 수 있습니다. 분. 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;
        }
    }

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

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

    SpringBoot가 freemarker를 통합하여 코드 생성기를 구현하는 방법

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

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

    새롭게 개발된 기능에 10개의 새 테이블을 추가해야 한다면, 이 시간을 기준으로 최소 100분은 걸릴 것입니다. 잘 생각해보면 실제로 대부분의 시간이 이러한 단순하고 반복적인 프로그래밍 서클에서 낭비된다는 것을 알게 될 것입니다. .

    SpringBoot가 freemarker를 통합하여 코드 생성기를 구현하는 방법이 간단한 CURD 코드를 모두 표준화하고 공개할 수 있는 방법이 있나요? 이러한 방식으로 우리는 비즈니스 시나리오 개발에 투자하는 데 많은 시간을 절약할 수 있습니다.

    🎜답은 그렇습니다, 그렇습니다! 🎜🎜초창기에 가장 먼저 접한 것이 MybatisGenertor 툴킷이었던 것으로 기억합니다. 이 툴킷을 통해 대부분의 xml에 저장할 수 있습니다. mybaits >curd 파일 준비. 🎜🎜공용 지속성 계층 동적 프록시 클래스 세트가 있는 우리에게 친숙한 JPA도 있습니다. 이 클래스는 이름을 기반으로 SQL 문을 자동으로 생성할 수 있습니다. 많은 개발 시간을 절약할 수 있습니다. 🎜🎜하지만 저는 controller, service, entity, dao에서 도구를 만들고 싶습니다. > 레이어에서는 단위 테스트 클래스를 포함한 모든 crud 코드가 도구에 의해 자동으로 생성됩니다. 🎜🎜이제 인터넷에는 친숙한 Mybatis-plus 플러그인과 같이 이 작업을 수행할 수 있고 사용하기도 매우 쉬운 도구가 많이 있습니다. 🎜🎜그러나 일부 회사는 이를 좋아하지 않으며 그 이유는 매우 간단합니다. 그 안에 있는 많은 공개 메소드가 너무 깊게 캡슐화되어 있고 많은 crudsql이 모두 캡슐화되어 있습니다. 동적으로 생성되면 전혀 볼 수 없습니다. 🎜🎜간단히 말하면, 많은 프로그래머들은 항상 다양한 의구심을 갖고 있습니다~~🎜🎜물론 마이크로서비스 개발이 완전히 지원될 수 없다는 의심도 있습니다. SpringBoot +Dubbo를 조합해서 개발했는데 이때 생성된 컨트롤러는 전혀 쓸모도 없고 맛도 없었습니다. 🎜🎜따라서 이 경우 신속한 개발 요구 사항을 충족하기 위해 현재 프로젝트 소프트웨어 개발 규칙을 기반으로 자체 코드 생성기를 개발해야 합니다. 🎜🎜이제 직접 코드 생성기를 개발하는 방법을 간략하게 소개하겠습니다. 과정은 다음과 같습니다! 🎜🎜2. 코드 연습🎜🎜사실 코드 생성기 개발은 모두가 생각하는 것만큼 복잡하지 않습니다. 가장 중요한 기술은 템플릿을 사용하여 코드를 생성하는 것입니다. /code>는 이를 달성하는 데 도움이 됩니다. 🎜

    2.1. 먼저 freemarker 종속성 패키지

    rrreee

    2.2를 추가한 다음 코드 템플릿을 생성합니다

    🎜동적으로 엔터티 클래스를 생성하고 엔터티 클래스를 작성해 보겠습니다. templateentity.java.ftl, 여기서 ${}는 동적 변수를 정의합니다. 🎜rrreee

    2.3. 마지막으로 대상 코드 생성

    🎜마지막으로 freemarker를 기반으로 테스트 클래스를 작성합니다! 🎜rrreee🎜프로그램을 실행하면 출력 파일 결과는 다음과 같습니다! 🎜rrreee🎜효과가 예상과 일치하고 성공적으로 생성되었습니다! 🎜🎜예를 들어 에디터는 이 방법을 사용합니다. 먼저, 도구에서 생성할 모든 코드는 템플릿을 통해 정의됩니다. 🎜🎜SpringBoot는 freemarker를 통합하여 코드 생성기를 구현하는 방법🎜🎜그런 다음 연결하세요. 데이터베이스 방식을 사용하여 자동 생성이 필요한 테이블 구조를 쿼리하고 이를 데이터 렌더링 매개변수로 캡슐화한 후 최종적으로 freemarker에 전달하면 원하는 코드를 매우 간단하고 빠르게 생성할 수 있습니다. . 단일 테이블의 모든 crud는 모두 한 단계로 완료됩니다! 🎜🎜다음은 현재 프로젝트를 기반으로 편집자가 맞춤화하고 개발한 코드 생성기입니다. 프로젝트는 SpringBoot + Dubbo 프레임워크를 사용하여 개발됩니다. . 스크린샷의 모든 코드 모든 코드는 코드 생성기를 사용하여 생성되며 단위 테스트를 통해 직접 실행할 수 있습니다. 개발이 매우 빠릅니다! 🎜🎜🎜🎜

    위 내용은 SpringBoot가 freemarker를 통합하여 코드 생성기를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

    이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

    적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

    이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

    카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

    이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

    캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

    이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

    Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

    Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

    DVWA

    DVWA

    DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

    SublimeText3 영어 버전

    SublimeText3 영어 버전

    권장 사항: Win 버전, 코드 프롬프트 지원!

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    Atom Editor Mac 버전 다운로드

    Atom Editor Mac 버전 다운로드

    가장 인기 있는 오픈 소스 편집기