mybatis generator(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Java 后端开发中,数据库操作是核心需求之一。MyBatis 作为一款灵活的持久层框架,虽然提供了强大的 SQL 映射能力,但手动编写大量的 Mapper XML 文件和 POJO 类,往往会让开发者陷入重复劳动的困境。这时,mybatis generator(MyBatis 代码生成器)便如同一把瑞士军刀,能高效地自动生成基础代码,释放开发者的创造力。本文将从原理、配置、使用场景及进阶技巧四个维度,为读者揭开这一工具的神秘面纱。


一、MyBatis Generator 是什么?

1.1 核心概念:自动化代码生成器

MyBatis Generator(简称 MBG) 是 MyBatis 官方提供的代码生成工具。它通过解析数据库表结构,自动生成以下内容:

  • POJO 类:对应数据库表的 Java 对象,包含字段、getter/setter 方法等。
  • Mapper XML 文件:定义 SQL 语句的 XML 文件,包含 CRUD 操作的 SQL 片段。
  • Mapper 接口(可选):定义数据库操作的接口,配合 MyBatis 的注解或 XML 使用。

形象地说,MBG 就像一个“代码流水线工人”——你只需告诉它数据库表的结构,它就能按照预设的模板,快速生产出标准化的代码零件。

1.2 为什么需要它?

对于中小型项目,手动编写代码可能不算负担,但随着项目规模扩大:

  • 重复性工作增加:每新增一个表,就需要编写对应的 POJO 和 SQL 代码。
  • 维护成本上升:表结构变更时,需同步修改多处代码。
  • 团队协作效率低:不同开发者可能写出风格迥异的代码,增加协作难度。

而 MBG 能:

  • 减少 80% 的重复代码,让开发者专注于业务逻辑。
  • 保证代码一致性,通过统一模板避免风格差异。
  • 快速响应表结构变更,通过重新生成代码同步修改。

二、快速入门:从零开始配置

2.1 环境准备

使用 MBG 需要以下环境:

  1. Java 8 或更高版本。
  2. Maven 或 Gradle 依赖管理工具(本文以 Maven 为例)。
  3. 数据库驱动(如 MySQL 的 mysql-connector-java)。

2.1.1 添加 Maven 依赖

在项目的 pom.xml 文件中,添加 MBG 的依赖:

<dependency>  
  <groupId>org.mybatis.generator</groupId>  
  <artifactId>mybatis-generator-core</artifactId>  
  <version>1.4.2</version>  
</dependency>  

2.2 编写配置文件

MBG 的配置文件通常命名为 generatorConfig.xml,放在项目的资源目录下。以下是一个基础配置示例:

<!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="mysql_context" targetRuntime="MyBatis3">  
    <jdbcConnection  
      driverClass="com.mysql.cj.jdbc.Driver"  
      connectionURL="jdbc:mysql://localhost:3306/test_db"  
      userId="root"  
      password="your_password">  
    </jdbcConnection>  

    <!-- 生成的 POJO 类配置 -->  
    <javaModelGenerator targetPackage="com.example.model"  
                        targetProject="src/main/java">  
      <property name="enableSubPackages" 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"/>  
  </context>  
</generatorConfiguration>  

2.2.1 配置项解析

  • jdbcConnection:数据库连接信息,需根据实际环境修改。
  • javaModelGenerator:指定 POJO 类的生成路径和包名。
  • sqlMapGenerator:指定 Mapper XML 文件的生成路径。
  • javaClientGenerator:指定 Mapper 接口的生成路径,type="XMLMAPPER" 表示使用 XML 配合接口。
  • table:定义需要生成代码的表,domainObjectName 可自定义 POJO 类名。

2.3 运行生成命令

通过 Maven 插件或 Java 主类运行 MBG:

<!-- 在 pom.xml 中配置插件 -->  
<build>  
  <plugins>  
    <plugin>  
      <groupId>org.mybatis.generator</groupId>  
      <artifactId>mybatis-generator-maven-plugin</artifactId>  
      <configuration>  
        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>  
        <overwrite>true</overwrite>  
      </configuration>  
    </plugin>  
  </plugins>  
</build>  

运行命令:

mvn mybatis-generator:generate  

三、生成代码的结构解析

3.1 POJO 类

以用户表为例,MBG 会生成类似以下代码:

public class User {  
  private Integer id;  
  private String name;  
  private Date createTime;  
  // 自动生成 getter/setter、toString 等方法  
}  

关键特性

  • 字段类型与数据库列类型自动匹配(如 VARCHAR 对应 StringDATETIME 对应 Date)。
  • 支持自定义日期类型(如 LocalDateTime),需在配置文件中设置 javaType

3.2 Mapper XML 文件

生成的 XML 文件包含标准的 CRUD SQL:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper  
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

<mapper namespace="com.example.mapper.UserMapper">  
  <!-- 查询单条记录 -->  
  <select id="selectByPrimaryKey" parameterType="int" resultType="User">  
    SELECT id, name, create_time  
    FROM user  
    WHERE id = #{id,jdbcType=INTEGER}  
  </select>  
</mapper>  

优势

  • SQL 语句自动适配数据库方言(如 MySQL 的 LIMIT、Oracle 的 ROWNUM)。
  • 支持批量操作(如 insertList),但需手动添加注解或配置。

3.3 Mapper 接口

如果启用了接口生成,会看到类似代码:

public interface UserMapper {  
  User selectByPrimaryKey(Integer id);  
  int insert(User record);  
  // 其他方法...  
}  

使用方式

// 在 Spring Boot 中注入 Mapper  
@Autowired  
private UserMapper userMapper;  

User user = userMapper.selectByPrimaryKey(1);  

四、进阶技巧与常见问题

4.1 自定义代码模板

MBG 允许通过自定义模板修改生成的代码结构。例如,若希望 POJO 类添加 Lombok 注解:

  1. 在配置文件中指定模板路径:
<javaModelGenerator targetPackage="com.example.model">  
  <property name="templateConfig">  
    <property name="fileOverride" value="true"/>  
    <property name="pojo" value="templates/PojoWithLombok.ftl"/>  
  </property>  
</javaModelGenerator>  
  1. 在模板文件中添加 @Data 注解:
@lombok.Data  
public class ${entity} {  
  // 字段和方法...  
}  

4.2 处理复杂场景

4.2.1 一对多关系

若用户表关联订单表,可通过 <association><collection> 标签定义关联关系:

<!-- 在生成配置中添加关系 -->  
<table tableName="user" domainObjectName="User">  
  <generatedKey column="id" sqlStatement="MySql" identity="true"/>  
  <columnOverride column="orders" property="orderList"/>  
</table>  

<table tableName="order" domainObjectName="Order">  
  <columnOverride column="user_id" property="userId"/>  
</table>  

4.2.2 自定义 SQL 片段

MBG 默认生成的 SQL 可能无法满足复杂需求(如分页、动态条件)。此时可在 XML 文件中手动添加自定义 SQL:

<!-- 在生成的 UserMapper.xml 中添加 -->  
<select id="selectWithCondition" resultType="User">  
  SELECT * FROM user  
  WHERE name LIKE CONCAT('%', #{keyword}, '%')  
</select>  

4.3 常见问题解答

Q:生成的代码覆盖了之前的修改怎么办?
A:建议通过以下方式解决:

  • 使用注释标记:MBG 会保留 @mbggenerated 注释外的代码。
  • 分离自定义逻辑:将业务逻辑抽取到 Service 层,避免直接修改 Mapper 接口或 XML。

Q:如何排除特定列的生成?
A:在配置文件中使用 <ignore> 标签:

<table tableName="user">  
  <ignore column="password"/> <!-- 忽略密码字段 -->  
</table>  

五、最佳实践与性能优化

5.1 与版本控制的配合

  • 将生成的代码加入版本控制:确保团队成员代码一致。
  • 排除配置文件的敏感信息:如数据库密码,可通过环境变量或外部配置管理。

5.2 性能优化技巧

  • 按需生成代码:通过 <table> 标签的 schematableName 筛选特定表。
  • 增量生成:MBG 的 <generatedKey> 标签可指定自增主键策略,减少 SQL 注入风险。

5.3 与 MyBatis-Plus 的结合

若项目同时使用 MyBatis-Plus,可通过以下方式提升效率:

  1. 在配置文件中启用 BaseModel:
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>  
  1. 在 POJO 类中继承 Model 类:
@Data  
public class User extends Model<User> {  
  // 字段...  
}  

六、总结与展望

MyBatis Generator 是提升开发效率的利器,尤其适合需要快速搭建基础数据层的场景。它通过自动化生成代码,让开发者从重复劳动中解放,专注于业务逻辑的实现。然而,工具始终是工具——在使用 MBG 时,仍需注意以下原则:

  1. 代码质量优先:定期检查生成的 SQL 是否符合性能规范。
  2. 灵活扩展:通过模板和插件机制,适配项目特殊需求。
  3. 安全第一:避免将敏感配置暴露在生成配置文件中。

未来,随着 MyBatis 生态的演进,MBG 也将持续优化对新特性(如 Java 17、注解式 Mapper)的支持。掌握这一工具,将为开发者在项目中构建高效、可维护的持久层提供坚实基础。

最新发布