Mybatis-Plus代码生成器

前言

这篇文章将记录我学习了解Mybatis-Plus代码生成器相关知识。其中用到了spring-boot框架、mysql数据库、mybatis-plus、lombok插件、API文档框架Swagger。

Mybatis-Plus代码生成器简述

在后端项目中经常需要创建Entity、Mapper、Service、Controller 、Mapper.xml文件,存在两个主要缺点:

  1. 这个过程中手动创建有时会容易出错,比如Entity类名写错或是类里面的某个对应数据库表字段的变量名字写错。
  2. 这个过程经常反复操作、比较繁琐、而且根本就是机械式操作。

为了节省开发时间,baomidou团队给mybatis-plus添加了代码生成器类AutoGenerator,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

实现步骤

下面我引入在项目中用到的代码生成器

一. 添加相关依赖

在pom.xml导入代码生成器依赖


    com.baomidou
    mybatis-plus-generator
    latest-version


项目中用到了freemarker模板引擎,导入依赖


    org.freemarker
    freemarker

其实MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎。

二. 创建mybatis-plus代码生成器执行类

创建目录,这个类命名为CodeGenerator


项目结构.PNG

三. 在GodeGenerator中编写相关配置代码

package com.wzubi.maxmoney.utils;

import com.baomidou.mybatisplus.annotation.DbType;
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.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;
import java.util.Scanner;

/**
 * @author jq
 * @since 2019-12-24
 */
public class CodeGenerator {

    /**
     * 

* 读取控制台内容 *

*/ 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.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); // 数据源配置 autoGenerator.setDataSource(new DataSourceConfig() .setDriverName("com.mysql.cj.jdbc.Driver") // 设置数据库类型 .setDbType(DbType.MYSQL) // 数据库连接账户和密码 .setUsername("root") .setPassword("root") // 数据库连接的url .setUrl("jdbc:mysql://localhost:3306/max-money?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&useAffectedRows=true&serverTimezone=CTT") // 类型转换,默认由 dbType 类型决定选择对应数据库内置实现,实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型 .setTypeConvert(new MySqlTypeConvert() { @Override public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) { System.out.println("转换类型:" + fieldType); String t = fieldType.toLowerCase(); if (t.contains("tinyint(1)")) { return DbColumnType.INTEGER; } return super.processTypeConvert(globalConfig, fieldType); } }) ); String projectPath = System.getProperty("user.dir"); // 全局配置 autoGenerator.setGlobalConfig(new GlobalConfig() // 输出目录 .setOutputDir(projectPath+ "/src/main/java") // 是否覆盖 .setFileOverride(true) //swagger注解 .setSwagger2(true) // 时间格式 .setDateType(DateType.ONLY_DATE) // 开启AR模式 .setActiveRecord(false) // XML二级缓存 .setEnableCache(false) // 生成ResultMap .setBaseResultMap(true) // 生成 sql片段 .setBaseColumnList(true) // 自动打开生成后的文件夹 .setOpen(false) // 所有文件的生成者 .setAuthor("jq") ); // 包配置 PackageConfig packageConfig = new PackageConfig() // 基本包路径 .setParent("com.wzubi.maxmoney") .setModuleName(scanner("模块名")) // 设置Mapper包名 .setMapper("dao"); autoGenerator.setPackageInfo(packageConfig); // 策略配置 autoGenerator.setStrategy(new StrategyConfig() // 需要生成的表 .setInclude(scanner("表名")) // 实体类使用Lombok .setEntityLombokModel(true) // 表名生成策略,下划线转驼峰 .setNaming(NamingStrategy.underline_to_camel) // 字段名生成策略,下划线转驼峰 .setColumnNaming(NamingStrategy.underline_to_camel) // 可以继承父实体类,没有可以不用配置 .setSuperEntityClass("com.wzubi.maxmoney.parent.entity.BaseEntity") // 自定义基础的Entity类的公共字段 .setSuperEntityColumns("id","deleted","create_time","update_time") // 生成 @RestController 控制器 .setRestControllerStyle(true) // 驼峰转连字符 .setControllerMappingHyphenStyle(true) // 逻辑删除属性名称 .setLogicDeleteFieldName("deleted") ); // 注入自定义配置 autoGenerator.setCfg(new InjectionConfig() { @Override public void initMap() { // Map map = new HashMap<>(1); // map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp"); // this.setMap(map); } }.setFileOutConfigList(Collections.singletonList( new FileOutConfig("/templates/mapper.xml.ftl") { // 自定义Mapper.xml输出路径 @Override public String outputFile(TableInfo tableInfo) { return projectPath + "/src/main/resources/mapper/" + packageConfig.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }))); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); // 不生成xml文件 templateConfig.setXml(null); autoGenerator.setTemplate(templateConfig); // 选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎 autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine()); autoGenerator.execute(); } }

总结:在个类中主要配置:

  1. 数据库源配置DataSourceConfig
  2. 数据库表配置StrategyConfig
  3. 包名配置PackageConfig
  4. 模板配置TemplateConfig
  5. 全局配置GlobalConfig
  6. 自定义注入配置InjectionConfig

4. 执行结果

启动CodeGenerator,输入以下你想要的模块名,和数据库表名


代码演示1.PNG

然后回车,生成代码完成,如图:


代码演示2.PNG

代码演示3.PNG

借用官方的动图演示:


动图演示

你可能感兴趣的:(Mybatis-Plus代码生成器)