文章目录
前言
本节内容主要实战 Spring Boot 集成 MyBatis,以及使用 MyBatis-Generator 自动生成对应的 Java Model、Mapper 和 XML 文件。此外,还可以生成一些高级查询功能。使用 MyBatis-Generator 可以显著降低开发者的工作量,提高开发效率。
一、创建 light-mgb
模块
由于我们需要使用 MyBatis-Generator 自动生成 model
和 mapper
等文件,这些文件通常不会频繁改动,而是跟随数据库设计的变化而变化。因此,我们单独拆分一个模块 light-mgb
,用于处理数据库实体模型。
创建步骤可以参考 《一.准备环境,从零开始搭建项目》。创建后的目录结构如下图所示:
二、引入Mybatis-Generator依赖
在 light-mgb
模块中引入 MyBatis-Generator
依赖:
dependencies {
implementation 'org.mybatis.generator:mybatis-generator-core:1.4.2'
}
三、使用Mybatis-Generator
3.1添加Mybatis-Generator配置文件
在light-mgb
的 src/main/resources
下 添加配置文件: generatorConfig.xml
,各配置参数详解参考注释,完整配置参数参考完整XML 配置参考注意配置中的包路径和mapper生成路径
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 配置SQL语句中的前置分隔符 -->
<property name="beginningDelimiter" value="`"/>
<!-- 配置SQL语句中的后置分隔符 -->
<property name="endingDelimiter" value="`"/>
<!-- 配置生成Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 为模型生成序列化方法 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!-- 生成 mapper.xml时不 merge 直接覆盖原文件 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator type="com.light.generator.CommentGenerator">
<!-- 是否阻止生成的注释 -->
<property name="suppressAllComments" value="true"/>
<!-- 是否阻止生成的注释包含时间戳 -->
<property name="suppressDate" value="true"/>
<!-- 是否添加数据库表的备注信息 -->
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!-- 配置MBG要连接的数据库信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/light-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"
userId="root"
password="123456">
<!-- 解决mysql驱动升级到8.0后不生成指定数据库代码的问题 -->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 用于控制实体类的生成 -->
<javaModelGenerator targetPackage="com.light.mgb.entity" targetProject="light-mgb\src\main\java"/>
<!-- 用于控制Mapper.xml文件的生成 -->
<sqlMapGenerator targetPackage="com.light.mgb.mapper" targetProject="light-mgb\src\main\resources"/>
<!-- 用于控制Mapper接口的生成 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.light.mgb.mapper"
targetProject="light-mgb\src\main\java"/>
<!-- 配置需要生成的表,生成全部表tableName设为% -->
<table tableName="%">
<!-- 用来指定主键生成策略 -->
<generatedKey column="id" sqlStatement="JDBC" identity="false"/>
</table>
</context>
</generatorConfiguration>
3.2添加自定义注释生成器CommentGenerator
在src/main/java/com.light.mgb
中创建CommentGenerator.java
类,
package com.light.mgb;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import java.util.Properties;
/**
* 自定义注释生成器
*/
public class CommentGenerator extends DefaultCommentGenerator {
private boolean addRemarkComments = false;
private static final String EXAMPLE_SUFFIX = "Example";
private static final String MAPPER_SUFFIX = "Mapper";
private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.v3.oas.annotations.media.Schema";
/**
* 设置用户配置的参数
*/
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
/**
* 给字段添加注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
//根据参数和备注信息判断是否添加swagger注解信息
if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
// addFieldJavaDoc(field, remarks);
//数据库中特殊字符需要转义
if (remarks.contains("\"")) {
remarks = remarks.replace("\"", "'");
}
//给model的字段添加swagger注解
field.addJavaDocLine("@Schema(title = \"" + remarks + "\")");
}
}
/**
* 给model的字段添加注释
*/
private void addFieldJavaDoc(Field field, String remarks) {
//文档注释开始
field.addJavaDocLine("/**");
//获取数据库字段的备注信息
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
for (String remarkLine : remarkLines) {
field.addJavaDocLine(" * " + remarkLine);
}
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
super.addJavaFileComment(compilationUnit);
//只在model中添加swagger注解类的导入
if (!compilationUnit.getType().getFullyQualifiedName().contains(MAPPER_SUFFIX) && !compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
}
}
}
3.3创建Generator启动类
在 src/main/java/com.light.mgb
中创建 Generator.java
类:
package com.light.mgb;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mapper,model代码生成工具
*/
public class Generator {
public static void main(String[] args) throws Exception {
//当生成的代码重复时 是否覆盖
boolean overwrite = true;
//读取我们的 MBG 配置文件
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
//MBG 执行过程中的警告信息
List<String> warnings = new ArrayList<String>();
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建 MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//输出警告信息
for (String warning : warnings) {
System.out.println(warning);
}
}
}
四、运行自动代码生成器
右键运行Generator
类,等待执行完毕后,可以看到我们model
和mapper
中都有自动生成的代码;
除了常规的实体类,Mapper
接口和xml
文件,还有个以Example
结尾的类,这个工具类主要用于组装sql
的where
条件;
主要类说明:
Criteria:条件的集合。
Criterion:某个条件。
UserExample:条件集合的集合,通过 createCriteria()
和 or()
方法创建条件集合。
五、附上mysql数据结构
CREATE TABLE `t_user` (
`id` bigint NOT NULL,
`sex` int NULL DEFAULT NULL COMMENT '性别',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
`age` int NULL DEFAULT NULL COMMENT '年龄',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
总结
此篇文章主要记录Spring Boot
如何通过Mybatis-Generator
自动生成Model、Mapper、Xml
代码的用法,其中一些原理和详细的配置可以通过上述官网链接进行查阅学习,但这不是本文的重点