开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
今天的主角是MP推出的一款代码生成器,本文主要来介绍一下它强大的代码生成功能。
一、概述
AutoGenerator 是 MyBatis Plus推出的代码生成器,可以快速生成Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码,比Mybatis Generator更强大,开发效率更高。
以往我们使用mybatis generator生成代码正常需要配置mybatis-generator-config.xml,代码配置比较繁琐复杂,比如:
<generatorConfiguration>
<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
<span class="hljs-comment"><!-- 注释 --></span>
<span class="hljs-tag"><<span class="hljs-name">commentGenerator</span>></span>
<span class="hljs-comment"><!-- 是否不生成注释 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"suppressAllComments"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"true"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">commentGenerator</span>></span>
<span class="hljs-comment"><!-- jdbc连接 --></span>
<span class="hljs-tag"><<span class="hljs-name">jdbcConnection</span> <span class="hljs-attr">driverClass</span>=<span class="hljs-string">"com.mysql.cj.jdbc.Driver"</span> <span class="hljs-attr">connectionURL</span>=<span class="hljs-string">"jdbc:mysql://ip:3306/codingmoretiny02?useUnicode=true<span class="hljs-symbol">&amp;</span>characterEncoding=utf-8<span class="hljs-symbol">&amp;</span>serverTimezone=Asia/Shanghai<span class="hljs-symbol">&amp;</span>useSSL=false"</span> <span class="hljs-attr">userId</span>=<span class="hljs-string">"codingmoretiny02"</span> <span class="hljs-attr">password</span>=<span class="hljs-string">"123456"</span>></span>
<span class="hljs-comment"><!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true--></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"nullCatalogMeansCurrent"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"true"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">jdbcConnection</span>></span>
<span class="hljs-comment"><!-- 类型转换 --></span>
<span class="hljs-tag"><<span class="hljs-name">javaTypeResolver</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"forceBigDecimals"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"true"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">javaTypeResolver</span>></span>
<span class="hljs-comment"><!-- 生成实体类地址 --></span>
<span class="hljs-tag"><<span class="hljs-name">javaModelGenerator</span> <span class="hljs-attr">targetPackage</span>=<span class="hljs-string">"com.codingmore.mbg.po"</span> <span class="hljs-attr">targetProject</span>=<span class="hljs-string">"src/main/java"</span>></span>
<span class="hljs-comment"><!-- 是否针对string类型的字段在set方法中进行修剪,默认false --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"trimStrings"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"true"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">javaModelGenerator</span>></span>
<span class="hljs-comment"><!-- 生成Mapper.xml文件 --></span>
<span class="hljs-tag"><<span class="hljs-name">sqlMapGenerator</span> <span class="hljs-attr">targetPackage</span>=<span class="hljs-string">"com.codingmore.mbg.mapper"</span> <span class="hljs-attr">targetProject</span>=<span class="hljs-string">"src/main/resources"</span>></span>
<span class="hljs-tag"></<span class="hljs-name">sqlMapGenerator</span>></span>
<span class="hljs-comment"><!-- 生成 XxxMapper.java 接口--></span>
<span class="hljs-tag"><<span class="hljs-name">javaClientGenerator</span> <span class="hljs-attr">targetPackage</span>=<span class="hljs-string">"com.codingmore.mbg.dao"</span> <span class="hljs-attr">targetProject</span>=<span class="hljs-string">"src/main/java"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"XMLMAPPER"</span>></span>
<span class="hljs-tag"></<span class="hljs-name">javaClientGenerator</span>></span>
<span class="hljs-tag"><<span class="hljs-name">table</span> <span class="hljs-attr">schema</span>=<span class="hljs-string">""</span> <span class="hljs-attr">tableName</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">domainObjectName</span>=<span class="hljs-string">"User"</span> <span class="hljs-attr">enableCountByExample</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">enableDeleteByExample</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">enableSelectByExample</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">enableUpdateByExample</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">selectByExampleQueryId</span>=<span class="hljs-string">"false"</span>></span>
<span class="hljs-tag"></<span class="hljs-name">table</span>></span>
<span class="hljs-tag"></<span class="hljs-name">context</span>></span>
</generatorConfiguration>
复制代码
二、使用AutoGenerator
1. 初始化数据库表结构(以User用户表为例)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
– ----------------------------
– Table structure for user
– ----------------------------
DROP TABLE IF EXISTS <span class="hljs-keyword">user</span>;
CREATE TABLE <span class="hljs-keyword">user</span> (
id bigint(20) NOT NULL AUTO_INCREMENT,
username varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ‘用户名’,
mobile varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT ‘手机号’,
create_by varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT ‘创建人’,
create_time datetime(0) NULL DEFAULT NULL COMMENT ‘创建时间’,
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX username(username) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = ‘用户’ ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
复制代码
2. 在 pom.xml 文件中添加 AutoGenerator 的依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
复制代码
3. 添加模板引擎依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,这里使用Freemarker引擎。
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
复制代码
4. 全局配置
package com.shardingspherejdbc.mybatisplus.genertor;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.shardingspherejdbc.mybatisplus.engine.EnhanceFreemarkerTemplateEngine;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/** * 代码生成器 * * @author: austin * @since: 2023/2/6 15:28 */
public class CodeGenerator {
public static void main(String[] args) {
// 数据源配置
FastAutoGenerator.create(“jdbc:mysql://localhost:3306/sharding-db0?serverTimezone=GMT%2B8”, “root”, “admin”)
.globalConfig(builder -> {
builder.author(“austin”) // 设置作者
.enableSwagger() // 开启 swagger 模式 默认值:false
.disableOpenDir() // 禁止打开输出目录 默认值:true
.commentDate(“yyyy-MM-dd”) // 注释日期
.dateType(DateType.ONLY_DATE) //定义生成的实体类中日期类型 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
.outputDir(System.getProperty(“user.dir”) + “/src/main/java”); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent(<span class="hljs-string">"com.shardingspherejdbc.mybatisplus"</span>) <span class="hljs-comment">// 父包模块名</span>
.controller(<span class="hljs-string">"controller"</span>) <span class="hljs-comment">//Controller 包名 默认值:controller</span>
.entity(<span class="hljs-string">"entity"</span>) <span class="hljs-comment">//Entity 包名 默认值:entity</span>
.service(<span class="hljs-string">"service"</span>) <span class="hljs-comment">//Service 包名 默认值:service</span>
.mapper(<span class="hljs-string">"mapper"</span>) <span class="hljs-comment">//Mapper 包名 默认值:mapper</span>
.other(<span class="hljs-string">"model"</span>)
<span class="hljs-comment">//.moduleName("xxx") // 设置父包模块名 默认值:无</span>
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty(<span class="hljs-string">"user.dir"</span>) + <span class="hljs-string">"/src/main/resources/mapper"</span>)); <span class="hljs-comment">// 设置mapperXml生成路径</span>
<span class="hljs-comment">//默认存放在mapper的xml下</span>
})
.injectionConfig(consumer -> {
Map<String, String> customFile = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><>();
<span class="hljs-comment">// DTO、VO</span>
customFile.put(<span class="hljs-string">"DTO.java"</span>, <span class="hljs-string">"/templates/entityDTO.java.ftl"</span>);
customFile.put(<span class="hljs-string">"VO.java"</span>, <span class="hljs-string">"/templates/entityVO.java.ftl"</span>);
consumer.customFile(customFile);
})
.strategyConfig(builder -> {
builder.addInclude(<span class="hljs-string">"user"</span>) <span class="hljs-comment">// 设置需要生成的表名 可边长参数“user”, “user1”</span>
.addTablePrefix(<span class="hljs-string">"tb_"</span>, <span class="hljs-string">"gms_"</span>) <span class="hljs-comment">// 设置过滤表前缀</span>
.serviceBuilder()<span class="hljs-comment">//service策略配置</span>
.formatServiceFileName(<span class="hljs-string">"%sService"</span>)
.formatServiceImplFileName(<span class="hljs-string">"%sServiceImpl"</span>)
.entityBuilder()<span class="hljs-comment">// 实体类策略配置</span>
.idType(IdType.ASSIGN_ID)<span class="hljs-comment">//主键策略 雪花算法自动生成的id</span>
.addTableFills(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Column</span>(<span class="hljs-string">"create_time"</span>, FieldFill.INSERT)) <span class="hljs-comment">// 自动填充配置</span>
.addTableFills(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Property</span>(<span class="hljs-string">"update_time"</span>, FieldFill.INSERT_UPDATE))
.enableLombok() <span class="hljs-comment">//开启lombok</span>
.logicDeleteColumnName(<span class="hljs-string">"deleted"</span>)<span class="hljs-comment">// 说明逻辑删除是哪个字段</span>
.enableTableFieldAnnotation()<span class="hljs-comment">// 属性加上注解说明</span>
.controllerBuilder() <span class="hljs-comment">//controller 策略配置</span>
.formatFileName(<span class="hljs-string">"%sController"</span>)
.enableRestStyle() <span class="hljs-comment">// 开启RestController注解</span>
.mapperBuilder()<span class="hljs-comment">// mapper策略配置</span>
.formatMapperFileName(<span class="hljs-string">"%sMapper"</span>)
.enableMapperAnnotation()<span class="hljs-comment">//@mapper注解开启</span>
.formatXmlFileName(<span class="hljs-string">"%sMapper"</span>);
})
<span class="hljs-comment">// 使用Freemarker引擎模板,默认的是Velocity引擎模板</span>
<span class="hljs-comment">//.templateEngine(new FreemarkerTemplateEngine())</span>
.templateEngine(<span class="hljs-keyword">new</span> <span class="hljs-title class_">EnhanceFreemarkerTemplateEngine</span>())
.execute();
}
}
复制代码
5. 自定义模板生成DTO、VO
package com.shardingspherejdbc.mybatisplus.engine;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Map;
/** * 代码生成器支持自定义[DTO\VO等]模版 * * @author: austin * @since: 2023/2/9 13:00 */
@Component
public class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-built_in">void</span> <span class="hljs-title function_">outputCustomFile</span>(<span class="hljs-params"><span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> customFile, TableInfo tableInfo, <span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Object</span>> objectMap</span>) {
<span class="hljs-title class_">String</span> entityName = tableInfo.<span class="hljs-title function_">getEntityName</span>();
<span class="hljs-title class_">String</span> otherPath = <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">getPathInfo</span>(<span class="hljs-title class_">OutputFile</span>.<span class="hljs-property">other</span>);
customFile.<span class="hljs-title function_">forEach</span>((key, value) -> {
<span class="hljs-title class_">String</span> fileName = <span class="hljs-title class_">String</span>.<span class="hljs-title function_">format</span>(otherPath + <span class="hljs-title class_">File</span>.<span class="hljs-property">separator</span> + entityName + <span class="hljs-string">"%s"</span>, key);
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">outputFile</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">File</span>(fileName), objectMap, value, <span class="hljs-literal">true</span>);
});
}
}
复制代码
未生成代码前的项目目录如下:
运行CodeGenerator生成代码:
14:20:21.127 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator - ==========================准备生成文件...==========================
14:20:22.053 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 执行SQL:show table status WHERE 1=1 AND NAME IN ('user')
14:20:22.081 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 返回记录数:1,耗时(ms):26
14:20:22.167 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 执行SQL:show full fields from `user`
14:20:22.171 [main] WARN com.baomidou.mybatisplus.generator.IDatabaseQuery$DefaultDatabaseQuery - 当前表[user]的主键为自增主键,会导致全局主键的ID类型设置失效!
14:20:22.182 [main] DEBUG com.baomidou.mybatisplus.generator.config.querys.MySqlQuery - 返回记录数:5,耗时(ms):14
14:20:22.502 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator - ==========================文件生成完成!!!==========================
复制代码
项目成功生成了Entity、Service、Controller、Mapper、Mapper.xml、DTO、VO文件。
User用户类
package com.shardingspherejdbc.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/** * <p> * 用户 * </p> * * @author austin * @since 2023-02-09 */
@Getter
@Setter
@TableName(“user”)
@ApiModel(value = “User对象”, description = “用户”)
public class User implements Serializable {
<span class="hljs-keyword">private</span> static <span class="hljs-keyword">final</span> long serialVersionUID = <span class="hljs-number">1L</span>;
<span class="hljs-meta">@TableId(value = <span class="hljs-string">"id"</span>, type = IdType.AUTO)</span>
<span class="hljs-keyword">private</span> <span class="hljs-built_in">Long</span> id;
<span class="hljs-meta">@ApiModelProperty(<span class="hljs-string">"用户名"</span>)</span>
<span class="hljs-meta">@TableField(<span class="hljs-string">"username"</span>)</span>
<span class="hljs-keyword">private</span> String username;
<span class="hljs-meta">@ApiModelProperty(<span class="hljs-string">"手机号"</span>)</span>
<span class="hljs-meta">@TableField(<span class="hljs-string">"mobile"</span>)</span>
<span class="hljs-keyword">private</span> String mobile;
<span class="hljs-meta">@ApiModelProperty(<span class="hljs-string">"创建人"</span>)</span>
<span class="hljs-meta">@TableField(<span class="hljs-string">"create_by"</span>)</span>
<span class="hljs-keyword">private</span> String createBy;
<span class="hljs-meta">@ApiModelProperty(<span class="hljs-string">"创建时间"</span>)</span>
<span class="hljs-meta">@TableField(value = <span class="hljs-string">"create_time"</span>, fill = FieldFill.INSERT)</span>
<span class="hljs-keyword">private</span> Date createTime;
}
复制代码
想了解MyBatis Plus代码生成配置可以参考官方配置:代码生成器配置新
总结
对比Mybatis的Generator和MyBatis-Plus的AutoGenerator,就可以得出这样一条结论:后者的配置更简单,开发效率也更高,功能也更强大——可快速生成Mapper、Model、Service、Controller、DTO/VO层代码,到这里AutoGenerator生成器的介绍已经完成,文章如果对你有所帮助,欢迎点赞👍+关注❤+收藏✔,我是👨🎓austin流川枫,我们下期见!




