信步漫谈之MyBatisPlus——自动生成代码


1 目的

使用MybatisPlus的自动生成工具,进行自动生成代码,留存操作方式,可使用伪代码实现。

2 程序结构

com.alfred.mybatisplus.autogenerator
    ∟ pom.xml
    ∟ src
        ∟ main
            ∟ java
                ∟ com
                    ∟ alfred
                        ∟ mybatisplus
                            ∟ autogenerator
                                ∟ CodeGenerator.java
            ∟ resources
                ∟ templates
                    ∟ mapper.xml.ftl
        ∟ test
            ∟ java

3 程序代码

  • CodeGenerator.java
package com.alfred.mybatisplus.autogenerator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.*;


/**
 * @Author: alfred
 * @Date: 2021/1/21
 * @description:
 */
public class CodeGenerator {

    private static String PROJECT_PATH = "com.alfred.mybatisplus.autogenerator";
    private static String TABLE_NAME = "";
    private static String ENTITY_NAME = "";

    /**
     * 全局配置
     */
    private static final String AUTHOR = "alfred";

    /**
     * 数据源配置
     */
    private static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/mybatisplus";
    private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DB_USERNAME = "root";
    private static final String DB_PASS = "123456";

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        //输入参数
        TABLE_NAME = scanner("表名");
        ENTITY_NAME = scanner("实体名");
        //代码生成器
        AutoGenerator mpg = new AutoGenerator();
        //全局配置
        mpg.setGlobalConfig(getGlobalConfig());
        //数据源配置
        mpg.setDataSource(getDataSourceConfig());
        //包配置
        mpg.setPackageInfo(getPackageInfoConfig());
        //模板配置
        mpg.setTemplate(getTemplateConfig());
        //模板引擎配置
        mpg.setTemplateEngine(getTemplateEngineConfig());
        //策略配置
        mpg.setStrategy(getStrategyConfig());
        //自定义配置
        mpg.setCfg(getInjectionConfig());
        //生成
        mpg.execute();
    }

    private static GlobalConfig getGlobalConfig() {
        GlobalConfig gc = new GlobalConfig();
//        String projectPath = System.getProperty("user.dir");
        //作者
        gc.setAuthor(AUTHOR);
        //是否打开输出目录
        gc.setOpen(false);
        // 是否覆盖目录
        gc.setFileOverride(true);
        // 是否Swagger2注解
        gc.setSwagger2(true);
        // 是否开启二级缓存
        gc.setEnableCache(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        //主键策略
        gc.setIdType(IdType.INPUT);
        //设置命名格式
        gc.setEntityName("%s");
        gc.setControllerName("%sController");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setServiceName("I%sService");
        gc.setServiceImplName("%sServiceImpl");
        return gc;
    }

    private static DataSourceConfig getDataSourceConfig() {
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(DB_URL);
        dsc.setDriverName(DB_DRIVER);
        dsc.setUsername(DB_USERNAME);
        dsc.setPassword(DB_PASS);
        return dsc;
    }

    private static PackageConfig getPackageInfoConfig() {
        PackageConfig pc = new PackageConfig();
        //设置主包名
        pc.setParent(PROJECT_PATH);
        return pc;
    }

    private static TemplateConfig getTemplateConfig() {
        TemplateConfig tc = new TemplateConfig();
        return tc;
    }

    private static AbstractTemplateEngine getTemplateEngineConfig() {
        // 使用 freemarker 模板引擎
        return new FreemarkerTemplateEngine();
    }

    private static StrategyConfig getStrategyConfig() {
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setInclude(TABLE_NAME);
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setEntityTableFieldAnnotationEnable(true);
        return strategy;
    }

    private static InjectionConfig getInjectionConfig() {
        //自定义注入信息配置
        Map<String, Object> map = new HashMap<>();
        //此处传递自定义参数后,可在模板ftl文件中使用${cfg.my_define}引用该参数
        map.put("my_define", "my_define");
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                this.setMap(map);
            }
        };
        cfg.setFileOutConfigList(getFileOutConfig());
        return cfg;
    }

    private static List<FileOutConfig> getFileOutConfig() {
        List<FileOutConfig> focList = new ArrayList<>();
        String mapperTemplatePath = "/templates/mapper.xml.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(mapperTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/resources/mapper/" + ENTITY_NAME + "Mapper" + StringPool.DOT_XML;
            }
        });

        String controllerTemplatePath = "/templates/controller.java.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(controllerTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/controller/" + ENTITY_NAME + "Controller" + StringPool.DOT_JAVA;
            }
        });

        String entityTemplatePath = "/templates/entity.java.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(entityTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/entity/" + ENTITY_NAME + StringPool.DOT_JAVA;
            }
        });

        String serviceTemplatePath = "/templates/service.java.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(serviceTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/service/I" + ENTITY_NAME + "Service" + StringPool.DOT_JAVA;
            }
        });

        String serviceImplTemplatePath = "/templates/serviceImpl.java.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(serviceImplTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/service/impl/" + ENTITY_NAME + "ServiceImpl" + StringPool.DOT_JAVA;
            }
        });
        return focList;
    }

}
  • mapper.xml.ftl
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${package.Mapper}.${table.mapperName}">
        <!-- ${cfg.my_define} -->
    <#if enableCache>
        <!-- 开启二级缓存 -->
        <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
    </#if>
</mapper>
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.alfred.version</groupId>
        <artifactId>version-mybatisplus-general</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.alfred.mybatisplus</groupId>
    <artifactId>mybatisplus-autogenerator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <description>
        功能:使用MybatisPlus的自动生成工具,进行自动生成代码,留存操作方式,可使用伪代码实现。
    </description>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>com.baomidou.mybatisplus.samples.generator.MpGeneratorTest</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <formats>
                        <format>html</format>
                        <format>xml</format>
                    </formats>
                    <instrumentation>
                        <ignoreMethodAnnotations>
                            <ignoreMethodAnnotation>lombok.Generated</ignoreMethodAnnotation>
                        </ignoreMethodAnnotations>
                    </instrumentation>
                    <check/>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
  • 数据库sql
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

4 生成效果

  • 输入生成条件
请输入表名:
user
请输入实体名:
User
  • 生成目录结构
com.alfred.mybatisplus.autogenerator
    ∟ pom.xml
    ∟ src
        ∟ main
            ∟ java
                ∟ com
                    ∟ alfred
                        ∟ mybatisplus
                            ∟ autogenerator
                                ∟ CodeGenerator.java
                                ∟ controller
                                    ∟ UserController.java
                                ∟ entity
                                    ∟ User.java
                                ∟ service
                                    ∟ impl
                                        ∟ UserServiceImpl.java
                                    ∟ IUserService.java
            ∟ resources
                ∟ mapper
                    ∟ UserMapper.xml
                ∟ templates
                    ∟ mapper.xml.ftl
        ∟ test
            ∟ java

5 其他

  • 模板文件可参考mybatis-plus-generator-3.4.1.jar包内的templates目录下,官方提供的默认模板
    各类模板引擎官方都提供有模板参考,未指定则使用默认模板,可自定义

6 参考资料(感谢)

mybatis-plus官网指南
官网示例项目集合

原文地址:https://www.cnblogs.com/alfredinchange/p/14314089.html