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 需要以下环境:
- Java 8 或更高版本。
- Maven 或 Gradle 依赖管理工具(本文以 Maven 为例)。
- 数据库驱动(如 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
对应String
,DATETIME
对应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 注解:
- 在配置文件中指定模板路径:
<javaModelGenerator targetPackage="com.example.model">
<property name="templateConfig">
<property name="fileOverride" value="true"/>
<property name="pojo" value="templates/PojoWithLombok.ftl"/>
</property>
</javaModelGenerator>
- 在模板文件中添加
@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>
标签的schema
和tableName
筛选特定表。 - 增量生成:MBG 的
<generatedKey>
标签可指定自增主键策略,减少 SQL 注入风险。
5.3 与 MyBatis-Plus 的结合
若项目同时使用 MyBatis-Plus,可通过以下方式提升效率:
- 在配置文件中启用 BaseModel:
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
- 在 POJO 类中继承
Model
类:
@Data
public class User extends Model<User> {
// 字段...
}
六、总结与展望
MyBatis Generator 是提升开发效率的利器,尤其适合需要快速搭建基础数据层的场景。它通过自动化生成代码,让开发者从重复劳动中解放,专注于业务逻辑的实现。然而,工具始终是工具——在使用 MBG 时,仍需注意以下原则:
- 代码质量优先:定期检查生成的 SQL 是否符合性能规范。
- 灵活扩展:通过模板和插件机制,适配项目特殊需求。
- 安全第一:避免将敏感配置暴露在生成配置文件中。
未来,随着 MyBatis 生态的演进,MBG 也将持续优化对新特性(如 Java 17、注解式 Mapper)的支持。掌握这一工具,将为开发者在项目中构建高效、可维护的持久层提供坚实基础。