mybatis-plus代码生成器

295 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

我们在刚开始web工程,或者说做与数据库相关的工程时,都会自己去手动编写dao,entity,service,controller等。而这部分代码都是按某种规范去编写的,有需求,就有对应的产品应运而生,AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,能够很大程度上提升开发效率。

本节主要围绕mybatis-plus的代码生成器进行实战讲解,讲解的是3.5之前的版本,3.5之后的版本,代码生成器规范又是另外一种,思想差不多。下面开始正式讲解。

首先我们搭建项目工程并取名code_generator,然后导入相应的pom依赖。

相关依赖有:mybatis-plus、mybatis-plus-generator、druid -spring-boot-starter 、mysql-connector-java、lombok、swagger-annotation、spring-web

新建一个带main方法的类如下(不需要太复杂):

public class xx_generator {

    public static void main(String[] args) {

    }
}

添加下面两行代码,这就是一个最简单的代码生成器。AutoGenerator就是mp里面的代码生成类,我们执行,当然不会生成任何代码,因为我们还没有去配置数据库什么的。

AutoGenerator mpg = new AutoGenerator();
mpg.execute();

我们使用DataSourceConfig来做数据库相关的设置,看下面这张图,是不是有点熟悉了?这些就是我们在做数据库连接时用到的那些参数。

image.png 我们设置一下这些参数,并将datasourceConfig放到代码生成器中,代码如下:

  • 我们将一些连接信息放到了最前面,以方便修改。
public class xx_generator {
    private static final String SERVICE_NAME = "content";

    //数据库账号
    private static final String DATA_SOURCE_USER_NAME  = "root";
    //数据库密码
    private static final String DATA_SOURCE_PASSWORD  = "admin";

    public static void main(String[] args) {
        //建一个代码生成器
        AutoGenerator mpg = new AutoGenerator();

        //数据库相关配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL);
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/xc148_" + SERVICE_NAME
                + "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8");
//    dsc.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername(DATA_SOURCE_USER_NAME);
        dataSourceConfig.setPassword(DATA_SOURCE_PASSWORD);
        mpg.setDataSource(dataSourceConfig);
        
        mpg.execute();
    }
}

当然,现在还不能来生成代码,因为生成的路径还没去配置。

默认使用的Velocity作为模版引擎

那接下来我们做一下全局配置来配置一下输出路径、作者名等信息。加上下面代码:

GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(true);
//生成路径
gc.setOutputDir(System.getProperty("user.dir") + "/code_generator/src/main/java");
mpg.setGlobalConfig(gc);

最后生成的文件如下:

image.png 到目前为止,会在项目跟路径下创建一个code_generator/src/main/java这样的路径来生成代码,我们还需要调整。我们需要生成到特定的包下面,这样做更适配我们的项目。包配置见下面代码:

PackageConfig pc = new PackageConfig();
pc.setModuleName(SERVICE_NAME);
pc.setParent("com.itcast");

pc.setServiceImpl("service.impl");
pc.setXml("mapper");
pc.setEntity("model.po");
mpg.setPackageInfo(pc);

代码生成到了com.itcast.content这个包路径下,如图:

image.png 当然,到这里还不够完整,因为考虑到需要生成数据库中的那些表、数据表名是否有前缀,字段是否要驼峰命名等问题,我们还需要做一下策略配置。这部分代码如下,容易理解不做介绍。

StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude("course_base");   //这里是控制映射哪些表
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
// Boolean类型字段是否移除is前缀处理
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
strategy.setRestControllerStyle(true);

// 自动填充字段配置
strategy.setTableFillList(Arrays.asList(
        new TableFill("create_date", FieldFill.INSERT),
        new TableFill("change_date", FieldFill.INSERT_UPDATE),
        new TableFill("modify_date", FieldFill.UPDATE)
));
mpg.setStrategy(strategy);

结果如图:

image.png 我们只生成了数据库中course_base表的相关mapper、service等代码。最后附上完整代码:

public class xx_generator {
    // TODO 修改服务名以及数据表名
    private static final String SERVICE_NAME = "content";

    //数据库账号
    private static final String DATA_SOURCE_USER_NAME  = "root";
    //数据库密码
    private static final String DATA_SOURCE_PASSWORD  = "admin1234";

    //生成的表
    private static final String[] TABLE_NAMES = new String[]{
//       "mq_message",
//       "mq_message_history"
            "course_base",
            "course_market",
            "teachplan",
            "teachplan_media",
            "course_teacher",
            "course_category"
//        "course_publish",
//        "course_publish_pre"
//       "course_category"
    };

    // TODO 默认生成entity,需要生成DTO修改此变量
    // 一般情况下要先生成 DTO类 然后修改此参数再生成 PO 类。
    private static final Boolean IS_DTO = false;

    public static void main(String[] args) {
        //建一个代码生成器
        AutoGenerator mpg = new AutoGenerator();

        //数据库相关配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL);
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/xc148_" + SERVICE_NAME
                + "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true");
//    dsc.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername(DATA_SOURCE_USER_NAME);
        dataSourceConfig.setPassword(DATA_SOURCE_PASSWORD);
        mpg.setDataSource(dataSourceConfig);
        //设置默认的模版引擎
        mpg.setTemplateEngine(new VelocityTemplateEngine());
        //全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setFileOverride(true);
        //生成路径
        gc.setOutputDir(System.getProperty("user.dir") + "/code_generator/src/main/java");
        gc.setAuthor("itcast"); //作者信息
        gc.setOpen(false);   //是否覆盖
        gc.setSwagger2(false);
        gc.setServiceName("%sService");
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);

        if (IS_DTO) {
            gc.setSwagger2(true);
            gc.setEntityName("%sDTO");
        }
        mpg.setGlobalConfig(gc);
        //包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(SERVICE_NAME);
        pc.setParent("com.itcast");

        pc.setServiceImpl("service.impl");
        pc.setXml("mapper");
        pc.setEntity("model.po");
        mpg.setPackageInfo(pc);

        // 设置模板
//        TemplateConfig tc = new TemplateConfig();
//        mpg.setTemplate(tc);
        //策略配置
        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_NAMES);   //这里是控制映射哪些表
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        // Boolean类型字段是否移除is前缀处理
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);
        strategy.setRestControllerStyle(true);

        // 自动填充字段配置
        strategy.setTableFillList(Arrays.asList(
                new TableFill("create_date", FieldFill.INSERT),
                new TableFill("change_date", FieldFill.INSERT_UPDATE),
                new TableFill("modify_date", FieldFill.UPDATE)
        ));
        mpg.setStrategy(strategy);
        mpg.execute();

    }
}