敞开成长之旅!这是我参与「日新计划 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">
<!-- 注释 -->
<commentGenerator>
<!-- 是否不生成注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- jdbc衔接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://ip:3306/codingmoretiny02?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false"
userId="codingmoretiny02"
password="123456">
<!--高版本的 mysql-connector-java 需求设置 nullCatalogMeansCurrent=true-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 类型转换 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
</javaTypeResolver>
<!-- 生成实体类地址 -->
<javaModelGenerator targetPackage="com.codingmore.mbg.po" targetProject="src/main/java">
<!-- 是否针对string类型的字段在set方法中进行修剪,默许false -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成Mapper.xml文件 -->
<sqlMapGenerator targetPackage="com.codingmore.mbg.mapper" targetProject="src/main/resources">
</sqlMapGenerator>
<!-- 生成 XxxMapper.java 接口-->
<javaClientGenerator targetPackage="com.codingmore.mbg.dao" targetProject="src/main/java" type="XMLMAPPER">
</javaClientGenerator>
<table schema="" tableName="user" domainObjectName="User"
enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
enableUpdateByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
二、运用AutoGenerator
1. 初始化数据库表结构(以User用户表为例)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`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("com.shardingspherejdbc.mybatisplus") // 父包模块名
.controller("controller") //Controller 包名 默许值:controller
.entity("entity") //Entity 包名 默许值:entity
.service("service") //Service 包名 默许值:service
.mapper("mapper") //Mapper 包名 默许值:mapper
.other("model")
//.moduleName("xxx") // 设置父包模块名 默许值:无
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置mapperXml生成途径
//默许存放在mapper的xml下
})
.injectionConfig(consumer -> {
Map<String, String> customFile = new HashMap<>();
// DTO、VO
customFile.put("DTO.java", "/templates/entityDTO.java.ftl");
customFile.put("VO.java", "/templates/entityVO.java.ftl");
consumer.customFile(customFile);
})
.strategyConfig(builder -> {
builder.addInclude("user") // 设置需求生成的表名 可边长参数“user”, “user1”
.addTablePrefix("tb_", "gms_") // 设置过滤表前缀
.serviceBuilder()//service战略装备
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl")
.entityBuilder()// 实体类战略装备
.idType(IdType.ASSIGN_ID)//主键战略 雪花算法主动生成的id
.addTableFills(new Column("create_time", FieldFill.INSERT)) // 主动填充装备
.addTableFills(new Property("update_time", FieldFill.INSERT_UPDATE))
.enableLombok() //敞开lombok
.logicDeleteColumnName("deleted")// 阐明逻辑删去是哪个字段
.enableTableFieldAnnotation()// 特点加上注解阐明
.controllerBuilder() //controller 战略装备
.formatFileName("%sController")
.enableRestStyle() // 敞开RestController注解
.mapperBuilder()// mapper战略装备
.formatMapperFileName("%sMapper")
.enableMapperAnnotation()//@mapper注解敞开
.formatXmlFileName("%sMapper");
})
// 运用Freemarker引擎模板,默许的是Velocity引擎模板
//.templateEngine(new FreemarkerTemplateEngine())
.templateEngine(new EnhanceFreemarkerTemplateEngine())
.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 {
@Override
protected void outputCustomFile(Map<String, String> customFile, TableInfo tableInfo, Map<String, Object> objectMap) {
String entityName = tableInfo.getEntityName();
String otherPath = this.getPathInfo(OutputFile.other);
customFile.forEach((key, value) -> {
String fileName = String.format(otherPath + File.separator + entityName + "%s", key);
this.outputFile(new File(fileName), objectMap, value, true);
});
}
}
未生成代码前的项目目录如下:
运转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 {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("用户名")
@TableField("username")
private String username;
@ApiModelProperty("手机号")
@TableField("mobile")
private String mobile;
@ApiModelProperty("创立人")
@TableField("create_by")
private String createBy;
@ApiModelProperty("创立时刻")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
}
想了解MyBatis Plus代码生成装备可以参考官方装备:代码生成器装备新
总结
比照Mybatis
的Generator
和MyBatis-Plus
的AutoGenerator
,就可以得出这样一条结论:后者的装备更简单,开发功率也更高,功能也更强壮——可快速生成Mapper
、Model
、Service
、Controller
、DTO/VO
层代码,到这儿AutoGenerator生成器的介绍现已完结,文章如果对你有所帮助,欢迎点赞+关注❤+收藏✔,我是austin流川枫,咱们下期见!