mybatis generator

 人参与 | 时间:2026-10-17 07:28:24

MyBatis Generator(简称 MBG)最直接的价值就一句话:它能根据数据库表结构,自动生成 Java 实体类、Mapper 接口和 XML 映射文件。你不需要再手写那些 getter/setter、resultMap 和基础 CRUD SQL。我第一次用它是在一个二十多张表的项目里,手动写了三张表的 Mapper 之后就觉得这事不对劲——重复劳动太多,字段一改还得全局搜替换。MBG 把这块活儿接过去了。

它的工作方式很朴素:读数据库的元数据,然后按模板吐出代码。配置文件通常叫 generatorConfig.xml,里面要写清楚 JDBC 连接、目标包名、表名。一个最小的配置大概长这样:

<context id="default" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/demo" userId="root" password="123456"/> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/> <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/> <table tableName="user" domainObjectName="User"/> </context> 

跑起来的方式有三种:命令行、Maven 插件、Java 代码。Maven 插件最省事,配好之后执行 mvn mybatis-generator:generate 就行。我一般把它绑在一个独立的 profile 上,避免每次构建都触发。

生成出来的东西分三类。实体类对应表字段,带完整的 getter/setter,还有 toString()。Mapper 接口包含 insert、selectByPrimaryKey、updateByPrimaryKey 这些基础方法,以及一个带 Example 后缀的重载版本。XML 文件里写好了对应的 SQL 和 resultMap。Example 这套东西是 MBG 比较有争议的设计——它允许你用链式调用拼 where 条件,比如 UserExample.createCriteria().andNameEqualTo("张三")。用习惯了确实方便,但条件一复杂,代码可读性下降得厉害。我的做法是:简单查询用 Example,复杂查询自己写 XML。

有几个坑得提前知道。第一,MBG 默认不会覆盖已有文件,它用 @mbg.generated 注解标记生成内容。如果你手动改了实体类又重新生成,改动可能被冲掉。第二,表结构变更后重新生成,旧字段的 getter 不会自动删除,得手动清理。第三,它生成的 XML 里 baseColumnList 和 Base_Column_List 这种命名风格混着来,看着有点乱,但功能没问题。

关于要不要用 MBG,我的判断是:表数量超过十张、字段经常调整、团队里没人愿意手写重复 SQL 的时候,它值得引入。反过来,如果项目只有三五张表,或者你用的是 MyBatis-Plus 这类自带代码生成器的框架,MBG 的优先级可以往后放。它不是什么架构级工具,就是一个减少重复劳动的代码生成器。用对了省时间,用错了就是多一层维护负担。

最后提一个实际观察:很多团队用了 MBG 之后,Mapper 接口里会混着生成方法和手写方法。这本身没问题,但要注意 XML 文件里 namespace 必须对应同一个接口,否则启动就报 Invalid bound statement。这个错误我见过至少五次,每次都是有人新建了 XML 但忘了改 namespace。

顶: 85踩: 9