5.4 代码生成器 MBG


文档摘要

5.4 代码生成器 MBG 本节摘要:MyBatis Generator 读数据库元数据,批量生成实体、Mapper 接口与 XML——三十张表的标准手术方案一次预制到位。本节走完配置、运行、验证的全程,看懂它生成什么、不生成什么,学会用 Example 做条件查询,也认清它覆盖手写代码的风险边界。 前几节的器械都是"单台手术"级的:一个映射、一个处理器、一个插件。这一节解决量的问题——项目里三十张单表 CRUD,结构高度雷同,逐个手写既慢又容易抄错上一份的旧改法。MBG 的思路是直接读库表元数据,按模板批量出厂。

5.4 代码生成器 MBG

本节摘要:MyBatis Generator 读数据库元数据,批量生成实体、Mapper 接口与 XML——三十张表的标准手术方案一次预制到位。本节走完配置、运行、验证的全程,看懂它生成什么、不生成什么,学会用 Example 做条件查询,也认清它覆盖手写代码的风险边界。

前几节的器械都是"单台手术"级的:一个映射、一个处理器、一个插件。这一节解决量的问题——项目里三十张单表 CRUD,结构高度雷同,逐个手写既慢又容易抄错上一份的旧改法。MBG 的思路是直接读库表元数据,按模板批量出厂。

它生成什么,不生成什么

生成物 内容 对应前文章节
Java 实体(Model) 与列一一对应的字段、getter/setter,含 Example 类 2 章参数入
Mapper 接口 insert、update、delete、select 系列方法声明 1.5 接口绑定
Mapper XML 接口对应的完整 SQL 与 resultMap 2、3 章映射主干

同样要认清单不生成的:多表 join 的关联查询(2.3 的 association/collection 结构它不碰)、分页(交给 5.3 的插件或 PageHelper)、业务层逻辑、动态拼装的复杂 if/foreach——这些仍是你的活。MBG 只预制"标准件",定制件照旧手写。

MBG:读库表元数据,批量出厂标准件

配置文件逐段看

generatorConfig.xml 就四段:连什么库、实体去哪、XML 去哪、接口去哪,外加逐表声明:

<generatorConfiguration> <context id="MySQLTables" targetRuntime="MyBatis3"> <!-- 1. 数据库连接:驱动、URL、账号 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/shop" userId="dev" password="secret"/> <!-- 2. 实体:包名与项目路径;trimStrings 去首尾空格 --> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/> <!-- 3. XML:放 resources/mapper --> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/> <!-- 4. Mapper 接口:XMLMAPPER 表示与 XML 绑定 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/> <!-- 5. 逐表声明:类名映射 + 自增主键回填(2.3 讲过) --> <table tableName="orders" domainObjectName="Order"> <generatedKey column="id" sqlStatement="JDBC" identity="true"/> </table> </context> </generatorConfiguration>

运行两条路任选:Maven 插件跑 mvn mybatis-generator:generate,或写个 main 类调 MyBatisGenerator。批量表场景一行 table 配一张,也可以用通配配整库。

Example:生成的条件查询怎么用

MBG 给每张表配一个 Example 类,用来拼 where 条件——不用写 SQL 就能做组合查询:

// 查 status=PAID 且金额大于 100 的订单,按创建时间倒序 OrderExample ex = new OrderExample(); ex.createCriteria() .andStatusEqualTo("PAID") .andAmountGreaterThan(new BigDecimal("100")); ex.setOrderByClause("created_at DESC"); List<Order> list = orderMapper.selectByExample(ex);

边界也要认清:Example 适合单表的动态条件,条件一复杂(子查询、join、or 嵌套深了)可读性急剧下降。复杂查询回到 4 章的动态 SQL 手写,别把 Example 拧成麻花。

⚠️ 常见坑:重复生成会覆盖手写代码。实体和接口是整文件重写,你在里面补的方法直接丢;XML 更隐蔽——MBG 会把新内容追加进已有文件,mapper 里出现重复 id,启动就报"already contains value"。规矩是:生成物只改生成侧(重新生成),手写扩展放进独立文件或用 SQL 片段引用,两边永不混写。

💡 关键直觉:MBG 的价值在"表结构稳定 + 单表操作多"的场景,一次预制全部标准件。表结构频繁变的库要慎用——每次变更都重生成一次,覆盖风险就多暴露一次。

本节要点回顾

  • 三件套一次出厂:实体(含 Example)、Mapper 接口、XML,按库表元数据批量生成
  • 四段配置:连库、实体去向、XML 去向、接口去向,逐表声明主键回填
  • Example 管单表动态条件:复杂查询仍手写,别把条件拼成麻花
  • 覆盖是最大风险:实体接口整文件重写、XML 追加冲突,生成物与手写扩展严格分家
  • 只预制标准件:join、分页、业务逻辑不在出厂清单

监护设备至此配齐。下一节是本章收口:把整张手术台搬进 Spring——SqlSessionTemplate 为什么线程安全、事务为什么必须交出去。


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