MyBatis Plus代码生成器,手把手讲解,粘贴运行即可!

288 阅读5分钟

本人是非开发岗转岗开发的,后续又接手了后端开发的工作,在工作过程中发现,中文互联网的教程往往默认读者是有编程基础的,但实际上,对最初学习编程的我来说,如何启动项目都是需要查阅资料的程度,所以我写的文章,尽量浅显易懂,假设您零基础,赶鸭子上架直接上了项目,不得不写代码。

MyBatis Plus是一个基于MyBatis的增强框架,它为MyBatis提供了更多的实用功能和便捷性。MyBatis是一个流行的Java持久层框架,主要用于与关系型数据库进行交互。MyBatis Plus在MyBatis的基础上,提供了一些额外的功能,帮助开发者更高效地进行数据库操作。

MyBatis Plus的主要特点和功能包括:

  1. 代码生成器:MyBatis Plus提供了一个代码生成器,可以自动生成实体类、映射器(Mapper)、服务接口(Service)以及服务实现类(ServiceImpl),从而减少了开发人员手动编写这些代码的工作量。
  2. 通用CRUD操作:MyBatis Plus提供了一系列通用的增删改查(CRUD)方法,简化了开发者对数据库进行基本操作的代码编写。
  3. 条件构造器:MyBatis Plus提供了一个强大的条件构造器,方便开发者构建复杂的查询条件,无需手动拼接SQL语句。
  4. 分页插件:MyBatis Plus提供了一个简单易用的分页插件,开发者可以快速实现分页查询功能。
  5. 性能分析插件:MyBatis Plus提供了性能分析插件,可以监控和分析SQL执行性能,帮助开发者找到潜在的性能问题。
  6. 多租户支持:MyBatis Plus支持多租户功能,方便开发者实现基于租户的数据隔离。
  7. 乐观锁插件:MyBatis Plus提供了乐观锁插件,用于解决多线程并发下的数据一致性问题。
  8. 支持lambda表达式:MyBatis Plus支持Java 8的lambda表达式,可以让开发者编写更简洁的代码。

总之,MyBatis Plus作为一个增强框架,提供了许多实用的功能,使得开发者在使用MyBatis进行数据库操作时更加高效和便捷。

代码生成

本文介绍的就是MyBatis Plus提供的代码生成器。如我上述所介绍,通过代码生成器可以自动生成实体类、映射器、服务接口、服务实现类等,可以极大的减少您的工作量。这里简单介绍一下实体类、映射器(Mapper)、服务接口(Service)、服务实现类(ServiceImpl)等。

生成了哪些文件?

生成的这些文件,简单来说包含直接操作数据库的mapper.xml文件,以及映射器(mapper),服务实现类(impl.java)、服务接口(service.java)以及前端控制器(controller.java),前端控制器(controller.java)文件需要你编写供前端使用的接口,mapper.xml文件用来操作数据库,而服务实现类(impl.java)文件,顾名思义,你的业务逻辑需要在这里实现。

引入依赖

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency>

在config文件夹下创建MybatisGenerator.java文件

image.png

导入包

import com.baomidou.mybatisplus.core.toolkit.StringPool;
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 java.util.ArrayList;
import java.util.List;

代码生成器

/**
 * 代码生成
 *
 * @author 朝来试看青枝上
 * @date 2023-04-13
 */
public class MybatisGenerator {

    public static void main(String[] args) {
        generator("***",//作者信息
                "jdbc:postgresql:",//这里键入你的数据库信息
                "org.postgresql.Driver",//数据库驱动器
                "*****",//数据库账号
                "********",//数据库密码
                "com.***",//项目包名
                "",
                "",
                "*****",//数据库表名称
                "",
                new String[]{});
    }

    /**
     * 代码生成器
     *
     * @param author         作者
     * @param url            url,不需要带问号
     * @param driverName     驱动名称
     * @param username       用户名
     * @param password       密码
     * @param parent         父级类名,com.zjugis.xxx
     * @param projectModule  子模块名称,存在maven父子项目时填写子模块名称
     * @param functionModule 功能模块,用于包分类
     * @param tableName      表名,多个表名用逗号分隔
     * @author 朝来试看青枝上
     * @date 2023/04/13
     */
    public static void generator(String author,
                                 String url,
                                 String driverName,
                                 String username,
                                 String password,
                                 String parent,
                                 String projectModule,
                                 String functionModule,
                                 String tableName,
                                 String parentEntityClass,
                                 String[] parentEntityColumns) {
        AutoGenerator mpg = new AutoGenerator();
        mpg.setGlobalConfig(globalConfig(author, projectModule));
        mpg.setDataSource(dataSourceConfig(url, driverName, username, password));
        mpg.setPackageInfo(packageConfig(parent, functionModule));
        mpg.setCfg(injectionConfig(functionModule, projectModule));
        mpg.setTemplate(templateConfig());
        mpg.setStrategy(strategyConfig(tableName, parentEntityClass, parentEntityColumns));
        mpg.execute();
    }

    /**
     * 全局配置
     *
     * @param author        作者
     * @param projectModule 项目模块
     * @return com.baomidou.mybatisplus.generator.config.GlobalConfig
     * @author 朝来试看青枝上
     * @date 2023/04/13
     */
    private static GlobalConfig globalConfig(String author, String projectModule) {
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        if (!"".equals(projectModule)) {
            //多模块工程路径设置
            gc.setOutputDir(projectPath + "/" + projectModule + "/src/main/java");
        } else {
            gc.setOutputDir(projectPath + "/src/main/java");
        }
        gc.setAuthor(author);
        gc.setOpen(false);
        //实体属性 Swagger2 注解
        gc.setSwagger2(true);
        return gc;
    }

    /**
     * 数据源设置
     *
     * @param url        驱动连接的URL
     * @param driverName 驱动名称
     * @param username   数据库连接用户名
     * @param password   数据库连接密码
     * @return DataSourceConfig
     */
    private static DataSourceConfig dataSourceConfig(String url,
                                                     String driverName,
                                                     String username,
                                                     String password) {
        DataSourceConfig dsc = new DataSourceConfig();
//        if (url.contains("?")) {
        dsc.setUrl(url);
//        } else {
//            dsc.setUrl(url + "?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
//        }
        dsc.setDriverName(driverName);
        dsc.setUsername(username);
        dsc.setPassword(password);
        return dsc;
    }


    /**
     * 包配置
     *
     * @param parent         父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
     * @param functionModule 功能模块包名
     * @return PackageConfig
     */
    private static PackageConfig packageConfig(String parent, String functionModule) {
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(parent);
        if (!"".equals(functionModule)) {
            packageConfig.setEntity("entity." + functionModule);
            packageConfig.setService("service." + functionModule);
            packageConfig.setServiceImpl("service.impl." + functionModule);
            packageConfig.setMapper("mapper." + functionModule);
            packageConfig.setController("controller." + functionModule);
        } else {
            packageConfig.setParent(parent);
        }

        return packageConfig;
    }

    /**
     * 自定义配置,设置xml文件路径以及输出格式
     *
     * @param functionModule 功能模块名称
     * @return com.baomidou.mybatisplus.generator.InjectionConfig
     * @author 朝来试看青枝上
     * @date 2023/04/13
     */
    private static InjectionConfig injectionConfig(String functionModule, String projectModule) {

        String projectPath = System.getProperty("user.dir");
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 velocity
        String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                if (!"".equals(projectModule)) {
                    // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                    return projectPath + projectModule + "/src/main/resources/mapper/" + functionModule
                            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                } else {
                    // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                    return projectPath + "/src/main/resources/mapper/" + functionModule
                            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                }
            }
        });

        cfg.setFileOutConfigList(focList);

        return cfg;
    }


    /**
     * 模板路径配置项
     *
     * @return com.baomidou.mybatisplus.generator.config.TemplateConfig
     * @author 朝来试看青枝上
     * @date 2023/04/13
     */
    private static TemplateConfig templateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        return templateConfig;
    }

    private static StrategyConfig strategyConfig(String tableName, String parentEntityClass, String[] parentEntityColumns) {
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        if (parentEntityClass != null
                && !"".equals(parentEntityClass)
                && parentEntityColumns != null
                && parentEntityColumns.length > 0) {
            // 公共父类
            strategy.setSuperEntityClass(parentEntityClass);
            // 写于父类中的公共字段
            strategy.setSuperEntityColumns(parentEntityColumns);
        }
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
//        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
        if (!"".equals(tableName)) {
            strategy.setInclude(tableName.split(","));
        }
        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");
        return strategy;
    }

}