3.4 MyBatis 代码生成器 (MyBatis Generator - MBG)


文档摘要

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.

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.1 MBG 的优势

  • 减少重复代码: 自动生成基本的 CRUD 代码,避免手动编写大量的重复代码。

  • 提高开发效率: 快速生成代码,减少开发时间。

  • 降低出错率: 避免手动编写 SQL 语句可能出现的错误。

  • 统一代码风格: 生成的代码风格一致,易于维护。

  • 支持自定义: 可以通过配置进行自定义,满足不同的需求。

3.4.2 MBG 的工作原理

MBG 通过读取数据库的元数据信息(表结构、字段类型等),根据配置文件的指示,生成相应的 Java 代码和 XML 文件。

3.4.3 MBG 的配置

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&amp;characterEncoding=UTF-8&amp;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: 是否为自增主键。

3.4.4 MBG 的使用

  1. 添加 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>
  2. 创建 generatorConfig.xml 文件: 根据数据库和项目需求,创建 generatorConfig.xml 文件,并配置相应的参数。 通常将该文件放在 src/main/resources 目录下。

  3. 运行 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 代码即可生成代码。

  4. 查看生成的代码: MBG 会根据配置文件中的设置,在指定的目录中生成 Java Bean、Mapper 接口和 Mapper XML 文件。

3.4.5 MBG 的自定义

MBG 提供了丰富的自定义选项,可以满足不同的需求。

  • 自定义类型转换: 可以通过实现 JavaTypeResolver 接口来自定义类型转换规则。

  • 自定义代码生成器: 可以通过实现 Plugin 接口来自定义代码生成逻辑,例如添加额外的字段、方法或注释。

  • 自定义注释生成器: 可以通过实现 CommentGenerator 接口来自定义注释的生成方式。

  • 自定义 SQL 语句: 可以通过修改 Mapper XML 文件来自定义 SQL 语句。

  • 自定义表配置: 可以使用 <columnOverride><ignoredColumn> 元素来覆盖或忽略表中的某些字段。

自定义 Plugin 示例:

假设我们需要为生成的 Java Bean 添加 @ApiModel@ApiModelProperty 注解,可以使用自定义 Plugin 来实现。

  1. 创建自定义 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; } }
  2. generatorConfig.xml 中配置 Plugin:

    <context id="MySQLTables" targetRuntime="MyBatis3"> ... <plugin type="com.example.plugin.Swagger2Plugin"/> ... </context>

3.4.6 MBG 的注意事项

  • 数据库连接信息: 确保数据库连接信息配置正确,包括数据库驱动类名、连接 URL、用户名和密码。

  • 表名和类名: 表名和类名要对应,避免出现命名错误。

  • 代码覆盖: MBG 默认会覆盖已存在的代码,如果需要保留手动修改的代码,需要谨慎配置。

  • 版本兼容性: MBG 的版本要与 MyBatis 的版本兼容。

  • 自定义配置: 自定义配置需要仔细测试,确保生成的代码符合预期。

3.4.7 总结

MyBatis Generator 是一个非常有用的工具,可以帮助我们快速生成 MyBatis 的相关代码,提高开发效率。通过合理配置和自定义,可以满足不同的项目需求。 掌握 MBG 的使用,可以极大地简化 MyBatis 项目的开发流程,减少重复性工作。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U