mybatis-plus自controller开始一键生成curd代码(代码片段)

justry_deng justry_deng     2022-11-04     252

关键词:

效果展示

以生成employee表对应的CURD为例

  • 生成的文件
  • controller里面长这样

使用方式

  • 第一步:引入下方的给出的相关依赖
  • 第二步:将下方的单元测试类直接贴进去
  • 第三步:运行单元测试即可
    注:本人测试用的是junit5,如果用的是junit4的话,简单改一下即可

相关依赖

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

<!-- 代码生成器相关 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
    <scope>test</scope>
</dependency>

<!--  IOUtil、PathUtil工具类包 -->
<dependency>
    <groupId>com.idea-aedi</groupId>
    <artifactId>common-ds</artifactId>
    <version>2100.5.2</version>
</dependency>

代码生成器单元测试类

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.ConstVal;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.builder.Entity;
import com.baomidou.mybatisplus.generator.config.po.TableField;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.ideaaedi.commonds.io.IOUtil;
import com.ideaaedi.commonds.path.PathUtil;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.lang.NonNull;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

/**
 * mybatis-plus代码生成 &emsp;
 * <a href="https://baomidou.com/pages/779a6e/#%E4%BD%BF%E7%94%A8">代码生成官网</a>
 * &emsp;
 * <a href="https://baomidou.com/pages/981406/#%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE">配置说明官网</a>
 *
 * @author JustryDeng
 * @since 2022/6/28 9:26
 */
@SpringBootTest
public class MybatisPlusGeneratorHelper 
    
    private static final String templateDir = "mybatis-plus-templates";
    
    @Value("$spring.datasource.url")
    private String url;
    
    @Value("$spring.datasource.username")
    private String username;
    
    @Value("$spring.datasource.password")
    private String password;
    
    /**
     * true-使用自定义模板; false-使用默认模板
     */
    private static final boolean useCustomTemplate = true;
    
    /*
     * 自动生成模板文件
     */
    static 
        if (useCustomTemplate) 
            final String customTemplatesDirRePath = "/src/test/resources/" + templateDir + "/";
            String customTemplatesDirPath = PathUtil.getProjectRootDir(MybatisPlusGeneratorHelper.class)
                    .replace("/target/test-classes/", customTemplatesDirRePath);
            File customTemplatesDir = new File(customTemplatesDirPath);
            if (!customTemplatesDir.exists()) 
                System.err.println(MybatisPlusGeneratorHelper.class.getSimpleName() + ":自定义的模板文件不存在, 自动创建开始. 创建至:" + customTemplatesDirRePath);
                // TODO 将这三个类拷贝到自己的项目下,然后将这里的BaseDTO.class、BasePageDTO.class、 PageInfo.class换成自己的即可
                final String baseDTOName = YourBaseClass.BaseDTO.class.getName().replace("$", ".");
                final String basePageDTOName = YourBaseClass.BasePageDTO.class.getName().replace("$", ".");
                final String PageInfoName = YourBaseClass.PageInfo.class.getName().replace("$", ".");
                for (JustryDengTemplates templateInfo : JustryDengTemplates.values()) 
                    IOUtil.writeContentToFile(
                            templateInfo.getContent()
                                    .replace("JustryDeng_Placeholder.BaseDTO", baseDTOName)
                                    .replace("JustryDeng_Placeholder.BasePageDTO", basePageDTOName)
                                    .replace("JustryDeng_Placeholder.PageInfo", PageInfoName),
                            new File(customTemplatesDir, templateInfo.name));
                
                System.err.println(MybatisPlusGeneratorHelper.class.getSimpleName() + ":自定义的模板文件创建完成. 请重新运行单元测试以生成相关文件.");
                System.exit(-1);
            
        
    
    
    @Test
    void generate() 
        String outputRootDir = PathUtil.getProjectRootDir(MybatisPlusGeneratorHelper.class)
                .replace("/target/test-classes/", "/src/test/java/");
        String packagePath = MybatisPlusGeneratorHelper.class.getPackage().getName() + ".generator";
        // 先清空./generator/目录
        IOUtil.delete(new File(outputRootDir + packagePath.replace(".", "/")));
        
        
        // basic settings
        final FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> builder
                        // 设置作者
                        .author("mybatis-plus generator")
                        .commentDate("yyyy-MM-dd HH:mm:ss")
                        // 指定输出目录
                        .outputDir(outputRootDir)
                        // 开启swagger模式
                        //.enableSwagger()
                )
                // 包配置
                .packageConfig(builder -> builder
                        // 指定生成的类的所属包
                        .parent(packagePath)
                        .entity("entity.po")
                        .service("service")
                        .serviceImpl("service.impl")
                        .mapper("mapper")
                        .xml("mapper.xml")
                        .controller("controller")
                        .other("other"))
                // 策略配置
                .strategyConfig(builder -> builder
                        // => 表配置
                        // 设置需要生成代码的表名(不设置则全库生成) TODO
                        ///                       .addInclude(
                        ///                                "user_face_rec_info"
                        ///                        )
                        // 设置过滤表前缀
                        // .addTablePrefix("tmp_")
                        // 设置过滤表后缀
                        // .addTableSuffix("_tmp")
                        
                        // => entity配置
                        .entityBuilder()
                        .convertFileName((entityName) -> entityName + "PO")
                        /// 给po设置公共父类
                        ///.superClass(PoSupperEntity.class)
                        /// 设置生成的PO里面的对应字段有填充标识或者逻辑删除标识
                        /// // 逻辑删除字段名
                        /// .logicDeletePropertyName("del")
                        /// // 自动填充
                        /// .addTableFills(new Property("createdBy", FieldFill.INSERT))
                        /// .addTableFills(new Property("createdAt", FieldFill.INSERT))
                        /// .addTableFills(new Property("updatedBy", FieldFill.UPDATE))
                        /// .addTableFills(new Property("updatedAt", FieldFill.UPDATE))
                        // 启用TableField等相关注解
                        .enableTableFieldAnnotation()
                        .enableLombok()
                        
                        // => controller配置
                        .controllerBuilder()
                        .enableRestStyle()
                        .convertFileName((entityName) -> entityName + "Controller")
                        // .superClass(BaseController.class)
                        
                        // => service配置
                        .serviceBuilder()
                        .convertServiceFileName((entityName) -> entityName + "Service")
                        .convertServiceImplFileName((entityName) -> entityName + "ServiceImpl")
                        
                        // => mapper配置
                        .mapperBuilder()
                        .enableMapperAnnotation()
                        .convertMapperFileName((entityName) -> entityName + "Mapper")
                        .convertXmlFileName((entityName) -> entityName + "Mapper"))
                .templateEngine(useCustomTemplate ? new EnhanceFreemarkerTemplateEngine() : new FreemarkerTemplateEngine());
        
        // entity、service、serviceImpl、controller、mapper、xml,使用指定模板生成
        fastAutoGenerator.templateConfig((TemplateConfig.Builder builder) -> 
            if (useCustomTemplate) 
                /*
                 * 使用自定义的模板
                 * 注:参考mybatis-plus-generator包下的默认模板进行编写即可
                 * 注:自定义的模板放在classpath下的对应位置即可
                 * 注:指定模板时,无需带对应的模板后缀名(如:这里不带.ftl)
                 */
                builder
                        .entity("/" + templateDir + "/" + "custom_entity")
                        .service("/" + templateDir + "/" + "custom_service")
                        .serviceImpl("/" + templateDir + "/" + "custom_serviceImpl")
                        .controller("/" + templateDir + "/" + "custom_controller")
                        // 不改的话,用默认的即可
                        .mapper(ConstVal.TEMPLATE_MAPPER)
                        .xml(ConstVal.TEMPLATE_XML);
             else 
                // 使用mybatis-plus-generator包下的默认模板
                builder
                        .entity(ConstVal.TEMPLATE_ENTITY_JAVA)
                        .mapper(ConstVal.TEMPLATE_MAPPER)
                        .xml(ConstVal.TEMPLATE_XML)
                        .service(ConstVal.TEMPLATE_SERVICE)
                        .serviceImpl(ConstVal.TEMPLATE_SERVICE_IMPL)
                        .controller(ConstVal.TEMPLATE_CONTROLLER);
            
        );
        
        fastAutoGenerator.execute();
    
    
    
    /**
     * 您的项目中需要这三种类<br />
     */
    public static class YourBaseClass 
        /**
         * 基础模型
         *
         * @author JustryDeng
         * @since 2022/6/24 10:00
         */
        @Setter
        @Getter
        @ToString
        public static class BaseDTO implements Serializable 
            
            private static final long serialVersionUID = -1;
        
        
        /**
         * 基础模型
         *
         * @author JustryDeng
         * @since 2022/6/24 10:00
         */
        @Setter
        @Getter
        @ToString
        @SuppressWarnings("AlibabaPojoNoDefaultValue", "AlibabaPojoMustUsePrimitiveField")
        public static class BasePageDTO extends BaseDTO 
            
            /** 页码 */
            private int pageNum = 1;
            
            /** 每页条数 */
            private int pageSize = 10;
        
        
        /**
         * 分页信息模型
         *
         * @author kuoyi
         * @since 1.0.0
         */
        @Data
        
        public static class PageInfo<T> 
            
            /** 总条数 */
            private long total;
            
            /** 页码 */
            private int pageNum;
            
            /** 每页条数 */
            private int pageSize;
            
            /** 数据集 */
            private List<T> dataList;
            
            /**
             * 快速构造
             */
            @SuppressWarnings("unused")
            public static <T> PageInfo<T> of(long total, int pageNum, int pageSize) 
                return PageInfo.of(total, pageNum, pageSize, Collections.emptyList());
            
            
            /**
             * 快速构造
             */
            public static <T> PageInfo<T> of(long total, int pageNum, int pageSize, List<T> dataList) 
                PageInfo<T> pageInfo = new PageInfo<>();
                pageInfo.setTotal(total);
                pageInfo.setPageNum(pageNum);
                pageInfo.setPageSize(pageSize);
                pageInfo.setDataList(dataList);
                return pageInfo;
            
        
        
    
    
    /* --------------------------------------------------------------- 以下部分,可以不关心 --------------------------------------------------------------- */
    
    
    /**
     * 扩展FreemarkerTemplateEngine,生成更多相关文件
     */
    public static class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine 
        
        /**
         * (non-javadoc)
         *
         * @param customFile
         *         自定义文件; key-生成的文件; value-生成该文件使用的(classpath下的带模板文件后缀名的)模板文件
         * @param tableInfo
         *         表信息
         * @param objectMap
         *         模板可使用的占位符即对应变量值(即:objectMap里的key可以在模板文件中直接引用)
         */
        @Override
        protected void outputCustomFile(@NonNull Map<String, String> customFile, @NonNull TableInfo tableInfo,
                                        @NonNull Map<String, Object> objectMap) 
            String entityName = tableInfo.getEntityName();
            String entityPath = this.getPathInfo(OutputFile.entity);
            String originEntityName;
            if (entityName.endsWith("PO")) 
                originEntityName = entityName.substring(0, entityName.length() - 2);
             else 
                originEntityName = entityName;
            
            // 自定义一些key-value,以便在模板中获取对应的值
            String comment = tableInfo.getComment()mybatis-plus:了解mybatis-plus快速开始(mybatis+mybatis-plus,mybatis-plus自动做了属性映射)

01:Mybatis-Plus:了解Mybatis-Plus、快速开始(Mybatis+Mybatis-Plus,Mybatis-Plus自动做了属性映射)02:Mybatis-Plus:快速开始(Spring+Mybatis+Mabatis-Plus)03&#x 查看详情

mybatis-plus:快速开始(springboot+mybatis+mybatis)

01:Mybatis-Plus:了解Mybatis-Plus、快速开始(Mybatis+Mybatis-Plus,Mybatis-Plus自动做了属性映射)02:Mybatis-Plus:快速开始(Spring+Mybatis+Mabatis-Plus)03&#x 查看详情

mybatis-plus:快速开始(spring+mybatis+mabatis-plus)

本节案例承接上节案例01:Mybatis-Plus:了解Mybatis-Plus、快速开始(Mybatis+Mybatis-Plus,Mybatis-Plus自动做了属性映射)02:Mybatis-Plus:快速开始(Spring+Mybatis+Mabatis-Plus&#x 查看详情

我的mybatis-plus用法,被全公司同事开始悄悄模仿了!

本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。作者:我犟不过你关于mybatis-plus是什么,不多做介绍了,看官方文档:https://... 查看详情

mybatis-plus设置oracle自增长序列(sequence)

...,它是通过Sequence序列来进行完成的,因此需要在MyBatis-Plus中进行相关配置二、MyBatis-Plus在实体中映射Oracle的主键Sequence注意重点@KeySequence(value="ERMS_S_BIZ_ARCH_INFO" 查看详情

mybatis-plus03_分页插件自定义分页

文章目录①.分页插件②.xml自定义分页①.分页插件①.MyBatisPlus自带分页插件,只要简单的配置即可实现分页功能②.添加配置类@ConfigurationpublicclassMybatisPlusConfig@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor()MybatisPlusInterceptorint 查看详情

mybatis-plus03_分页插件自定义分页

文章目录①.分页插件②.xml自定义分页①.分页插件①.MyBatisPlus自带分页插件,只要简单的配置即可实现分页功能②.添加配置类@ConfigurationpublicclassMybatisPlusConfig@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor()MybatisPlusInterceptorint 查看详情

mybatis-plus使用pagehelp无效(代码片段)

转载自:同时使用mybatis和mybatis-plus时,pageHelper失效问题解决感谢大佬一、问题由来最近刚拿到一个别人的项目,该项目中使用mybatis和mybatis-plus来操作数据库,我们需要在此基础上添加新功能。做功能开发时一切... 查看详情

看了我的mybatis-plus用法,同事也开始悄悄模仿了(代码片段)

...击关注公众号,实用技术文章及时了解本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。关于mybatis-plus... 查看详情

mybatis-plus:代码生成器(通过autogenerator快速生成entitymapperxmlservicecontroller代码)mybatisx快速开发插件

本节案例承接自上节案例1.代码生成器AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成Entity、Mapper、Mapper、XML、Service、Controller等各个模块的代码,极大的提升了开发效率。1.1创建工程1.2导入相关依赖pom.x... 查看详情

mybatis-plus逆向生成代码(代码片段)

MyBatis-Plus逆向生成代码MyBatis-Plus插件,是国产的MyBatis框架的快速开发插件。其groupId是baomidou。功能是基于已存在的数据库表格,逆向生成Java代码,包括不限于:实体类型,Mapper接口,服务Service,控制器Controller。类似的插件框... 查看详情

mybatis-plus逆向生成代码(代码片段)

MyBatis-Plus逆向生成代码MyBatis-Plus插件,是国产的MyBatis框架的快速开发插件。其groupId是baomidou。功能是基于已存在的数据库表格,逆向生成Java代码,包括不限于:实体类型,Mapper接口,服务Service,控制器Controller。类似的插件框... 查看详情

springboot使用mybatis-plus+自动代码生成

一.SpringBoot使用mybatis-plus+自动代码生成使用mybatis-plus可以自动帮我们生成通用的controller,service,dao,mapper 二.加入依赖<!--mybatisplus与springboot整合--> <dependency> <groupId>com.baomidou</groupId& 查看详情

mybatis-plus自定义basemapper支持批量增删改操作(代码片段)

com.baomidou.mybatisplus.core.mapper.BaseMappercom.baomidou.mybatisplus.extension.service.IService经常使用mybatis的开发朋友们都知道mybatis提供了上述两种类型的预定义接口来帮助我们做单表的增删改查操作,IService方式和BaseMapper这两种方式的区别... 查看详情

springboot+mybatis-plus两种分页方法

参考技术A首先配置mybatis-plus配置第一种方式,mybatis-plus原生QueryWrapper方式分页,这种方式比较简单,可以不用修改Mapper,适合简单的增删改查。第二种方式,使用mapper文件的select注解,优点是可以方便的建立查询语句,可以联... 查看详情

mybatis-plus简介及入门案例(代码片段)

Mybatis简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。官网地址:https://www.baomidou.com/特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般... 查看详情

mybatis-plus自定义sql注入器查询@tablelogic逻辑删除后的数据(代码片段)

目录1 需求2 解决方案3 方案:3.1 方案1,继承 AbstractMethod拼接SQL语句3.2.方案2,继承 AbstractMethod拼接SQL语句4. 自定义SQL注入器,注册上述自定义的方法5. 自定义基础mapper,声明注册的方法6.使用声明的方法... 查看详情

mybatis-plus自定义sql注入器查询@tablelogic逻辑删除后的数据(代码片段)

...selectIgnoreLogicDelete6.3调用方法selectIgnoreLogicDeleteByMap1 需求Mybatis-plus使用@TableLogic注解进行逻辑删除数据后,在某些场景下,又需要查询该数据时,又不想写SQL。2 解决方案自定义Mybatis-plus的SQL注入器一劳永逸的解决... 查看详情