3.4 MyBatis 代码生成器 (MyBatis Generator - MBG) MyBatis 代码生成器 (MyBatis Generator - MBG) 详解 MyBatis Generator (MBG) 是一个强大的工具,可以自动生成 MyBatis 的相关代码,包括: Java Bean (Model): 对应数据库表的实体类。 Mapper 接口: 定义了对数据库进行 CRUD 操作的接口。 Mapper XML 文件: 包含了 SQL 语句和结果映射,实现 Mapper 接口。 MBG 的主要目标是简化开发流程,减少重复性代码的编写,提高开发效率,尤其是在表结构比较稳定,且需要进行大量 CRUD 操作的场景下。 3.4.
MyBatis Generator (MBG) 是一个强大的工具,可以自动生成 MyBatis 的相关代码,包括:
Java Bean (Model): 对应数据库表的实体类。
Mapper 接口: 定义了对数据库进行 CRUD 操作的接口。
Mapper XML 文件: 包含了 SQL 语句和结果映射,实现 Mapper 接口。
MBG 的主要目标是简化开发流程,减少重复性代码的编写,提高开发效率,尤其是在表结构比较稳定,且需要进行大量 CRUD 操作的场景下。
减少重复代码: 自动生成基本的 CRUD 代码,避免手动编写大量的重复代码。
提高开发效率: 快速生成代码,减少开发时间。
降低出错率: 避免手动编写 SQL 语句可能出现的错误。
统一代码风格: 生成的代码风格一致,易于维护。
支持自定义: 可以通过配置进行自定义,满足不同的需求。
MBG 通过读取数据库的元数据信息(表结构、字段类型等),根据配置文件的指示,生成相应的 Java 代码和 XML 文件。
MBG 的核心在于其配置文件,通常命名为 generatorConfig.xml。该文件定义了 MBG 如何连接数据库、生成哪些文件、以及如何生成这些文件。 以下是一个典型的 generatorConfig.xml 文件:
<?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="MySQLTables" targetRuntime="MyBatis3"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!-- JDBC 连接信息 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai" userId="your_user" password="your_password"> </jdbcConnection> <!-- 类型转换 --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成的 Java Bean 存放位置 --> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成的 Mapper XML 文件存放位置 --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成的 Mapper 接口存放位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 需要生成的表配置 --> <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByPrimaryKeyQueryId="false"> <generatedKey column="id" sqlStatement="JDBC" identity="true"/> </table> <!-- 可以配置多个 table 元素来生成多个表的代码 --> </context> </generatorConfiguration>
配置项详解:
<generatorConfiguration>: 根元素。
<context>: 定义了一个生成环境,可以配置多个 context,针对不同的数据库或生成策略。
id: Context 的唯一标识。
targetRuntime: 指定 MyBatis 的版本,通常为 MyBatis3。
<property name="beginningDelimiter" value=""/>`: 设置数据库字段名的起始分隔符,例如 MySQL 中使用反引号。
<property name="endingDelimiter" value=""/>`: 设置数据库字段名的结束分隔符,例如 MySQL 中使用反引号。
<jdbcConnection>: 配置数据库连接信息。
driverClass: 数据库驱动类名。
connectionURL: 数据库连接 URL。
userId: 数据库用户名。
password: 数据库密码。
<javaTypeResolver>: 配置 Java 类型解析器,用于将数据库类型转换为 Java 类型。
<property name="forceBigDecimals" value="false"/>: 是否强制将所有 decimal 类型转换为 BigDecimal。<javaModelGenerator>: 配置 Java Bean 的生成。
targetPackage: 生成的 Java Bean 存放的包名。
targetProject: 生成的 Java Bean 存放的项目路径。
<property name="enableSubPackages" value="true"/>: 是否支持子包。
<property name="trimStrings" value="true"/>: 是否去除字符串类型的首尾空格。
<sqlMapGenerator>: 配置 Mapper XML 文件的生成。
targetPackage: 生成的 Mapper XML 文件存放的包名。
targetProject: 生成的 Mapper XML 文件存放的项目路径。
<property name="enableSubPackages" value="true"/>: 是否支持子包。
<javaClientGenerator>: 配置 Mapper 接口的生成。
type: 指定 Mapper 接口的生成类型,通常为 XMLMAPPER (与 XML 文件关联)。
targetPackage: 生成的 Mapper 接口存放的包名。
targetProject: 生成的 Mapper 接口存放的项目路径。
<property name="enableSubPackages" value="true"/>: 是否支持子包。
<table>: 配置需要生成的表。
tableName: 数据库表名。
domainObjectName: 生成的 Java Bean 的类名。
enableCountByExample: 是否生成 countByExample 方法。
enableUpdateByExample: 是否生成 updateByExample 方法。
enableDeleteByExample: 是否生成 deleteByExample 方法。
enableSelectByExample: 是否生成 selectByExample 方法。
selectByPrimaryKeyQueryId: 是否使用自定义的 selectByPrimaryKey 查询 ID。
<generatedKey>: 配置主键生成策略。
column: 主键字段名。
sqlStatement: 主键生成 SQL 语句,例如 JDBC (自增主键) 或 SELECT UUID()。
identity: 是否为自增主键。
添加 MBG 依赖: 在 Maven 项目的 pom.xml 文件中添加 MBG 的依赖。
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.2</version> <!-- 使用最新版本 --> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> <!-- 使用与数据库对应的版本 --> </dependency>
创建 generatorConfig.xml 文件: 根据数据库和项目需求,创建 generatorConfig.xml 文件,并配置相应的参数。 通常将该文件放在 src/main/resources 目录下。
运行 MBG: 可以通过 Maven 插件或 Java 代码来运行 MBG。
Maven 插件: 在 pom.xml 文件中添加 MBG 的 Maven 插件。
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.2</version> <configuration> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies> </plugin> </plugins> </build>
然后在 Maven 项目中运行 mvn mybatis-generator:generate 命令。
Java 代码: 编写 Java 代码来运行 MBG。
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.File; import java.util.ArrayList; import java.util.List; public class MBGRunner { public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("src/main/resources/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); for (String warning : warnings) { System.out.println(warning); } } }
运行该 Java 代码即可生成代码。
查看生成的代码: MBG 会根据配置文件中的设置,在指定的目录中生成 Java Bean、Mapper 接口和 Mapper XML 文件。
MBG 提供了丰富的自定义选项,可以满足不同的需求。
自定义类型转换: 可以通过实现 JavaTypeResolver 接口来自定义类型转换规则。
自定义代码生成器: 可以通过实现 Plugin 接口来自定义代码生成逻辑,例如添加额外的字段、方法或注释。
自定义注释生成器: 可以通过实现 CommentGenerator 接口来自定义注释的生成方式。
自定义 SQL 语句: 可以通过修改 Mapper XML 文件来自定义 SQL 语句。
自定义表配置: 可以使用 <columnOverride> 和 <ignoredColumn> 元素来覆盖或忽略表中的某些字段。
自定义 Plugin 示例:
假设我们需要为生成的 Java Bean 添加 @ApiModel 和 @ApiModelProperty 注解,可以使用自定义 Plugin 来实现。
创建自定义 Plugin 类:
import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.TopLevelClass; import java.util.List; public class Swagger2Plugin extends PluginAdapter { @Override public boolean validate(List<String> warnings) { return true; } @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { // 添加 swagger 注解 topLevelClass.addImportedType("io.swagger.annotations.ApiModel"); topLevelClass.addAnnotation("@ApiModel(value = \"" + introspectedTable.getFullyQualifiedTable().getRemark() + "\")"); return true; } @Override public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { // 添加字段 swagger 注解 topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty"); field.addAnnotation("@ApiModelProperty(value = \"" + introspectedColumn.getRemarks() + "\")"); return true; } }
在 generatorConfig.xml 中配置 Plugin:
<context id="MySQLTables" targetRuntime="MyBatis3"> ... <plugin type="com.example.plugin.Swagger2Plugin"/> ... </context>
数据库连接信息: 确保数据库连接信息配置正确,包括数据库驱动类名、连接 URL、用户名和密码。
表名和类名: 表名和类名要对应,避免出现命名错误。
代码覆盖: MBG 默认会覆盖已存在的代码,如果需要保留手动修改的代码,需要谨慎配置。
版本兼容性: MBG 的版本要与 MyBatis 的版本兼容。
自定义配置: 自定义配置需要仔细测试,确保生成的代码符合预期。
MyBatis Generator 是一个非常有用的工具,可以帮助我们快速生成 MyBatis 的相关代码,提高开发效率。通过合理配置和自定义,可以满足不同的项目需求。 掌握 MBG 的使用,可以极大地简化 MyBatis 项目的开发流程,减少重复性工作。