尧图精选

MyBatis Generator高效开发:从基础配置到高级定制

🕒 发布时间:2026/9/16 10:00:41 📁 来源:尧图网络
1. 为什么我们需要MybatisGenerator作为一名常年与数据库打交道的Java开发者我经历过无数个手动编写实体类、Mapper接口和XML文件的深夜。还记得2016年参与某电商项目时面对87张表的绝望感——团队花了整整两周时间才完成基础CRUD代码的编写。直到遇见MybatisGenerator以下简称MBG这种低效的重复劳动才真正成为历史。MBG是MyBatis官方提供的代码生成工具它通过读取数据库表结构自动生成与表字段对应的POJO实体类基础CRUD操作的Mapper接口动态SQL组成的Mapper XML文件配套的Example查询条件类在Spring Boot项目中配合MyBatis-Spring-Boot-Starter使用开发效率至少提升300%。以用户管理系统为例原本需要2天完成的20张表基础代码使用MBG后30分钟即可生成全套可运行代码。重要提示虽然MBG能生成基础代码但复杂业务逻辑仍需手动编写。它最适合用于标准化CRUD操作建议生成后立即提交到版本控制避免后续覆盖修改。2. 环境准备与基础配置2.1 依赖引入方式对比MBG支持多种集成方式根据项目类型选择最适合的方案集成方式适用场景优点缺点Maven Plugin标准Maven项目构建时自动执行配置稍复杂Gradle PluginGradle项目任务集成度高社区版本兼容性问题独立Java程序非标准项目/多数据库环境灵活性最高需要手动维护运行环境IDE插件开发调试阶段可视化操作生成配置不可版本化管理对于大多数Spring Boot项目推荐使用Maven Plugin方式。在pom.xml中添加plugin groupIdorg.mybatis.generator/groupId artifactIdmybatis-generator-maven-plugin/artifactId version1.4.2/version dependencies !-- 添加数据库驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /plugin2.2 核心配置文件详解在src/main/resources下创建generatorConfig.xml这是MBG的核心大脑?xml version1.0 encodingUTF-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 idmysql targetRuntimeMyBatis3 jdbcConnection driverClasscom.mysql.cj.jdbc.Driver connectionURLjdbc:mysql://localhost:3306/shop userIdroot password123456 !-- 解决MySQL8小时连接断开问题 -- property nameautoReconnect valuetrue/ /jdbcConnection !-- Java模型生成配置 -- javaModelGenerator targetPackagecom.example.model targetProjectsrc/main/java property nameenableSubPackages valuetrue/ property nametrimStrings valuetrue/ /javaModelGenerator !-- SQL映射文件生成配置 -- sqlMapGenerator targetPackagemapper targetProjectsrc/main/resources property nameenableSubPackages valuetrue/ /sqlMapGenerator !-- DAO接口生成配置 -- javaClientGenerator typeXMLMAPPER targetPackagecom.example.mapper targetProjectsrc/main/java/ !-- 表配置 -- table tableNameuser domainObjectNameUser enableCountByExamplefalse enableUpdateByExamplefalse enableDeleteByExamplefalse enableSelectByExamplefalse selectByExampleQueryIdfalse generatedKey columnid sqlStatementMySQL identitytrue/ /table /context /generatorConfiguration关键配置项说明targetRuntime建议始终使用MyBatis3支持更丰富的特性trimStrings自动去除字符串前后空格避免常见脏数据问题enableSubPackages按表名创建子包保持代码结构清晰generatedKey配置自增主键避免手动处理ID生成3. 高级定制技巧3.1 自定义类型转换器当数据库字段类型与Java类型不匹配时可以通过TypeHandler实现自动转换。比如将数据库中的TINYINT(1)转换为Booleanpublic class BooleanTypeHandler extends BaseTypeHandlerBoolean { Override public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) { ps.setInt(i, parameter ? 1 : 0); } // 其他重写方法省略... }在generatorConfig.xml中配置table tableNameuser columnOverride columnis_vip javaTypeboolean typeHandlercom.example.handler.BooleanTypeHandler/ /table3.2 生成Swagger注解通过Plugin扩展可以在实体类上自动添加Swagger注解创建自定义插件类public class SwaggerModelPlugin extends PluginAdapter { Override public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn column, IntrospectedTable table, ModelClassType modelClassType) { field.addAnnotation(ApiModelProperty(value \ column.getRemarks() \)); return true; } }在配置文件中注册插件context plugin typecom.example.plugin.SwaggerModelPlugin/ /context3.3 生成Lombok注解避免生成冗余的getter/setter方法context plugin typeorg.mybatis.generator.plugins.LombokPlugin/ /context生成后的实体类将包含Data注解大幅减少样板代码。4. 实战中的避坑指南4.1 字段命名冲突问题当数据库使用SQL关键字作为列名如order、desc等时生成的代码会编译报错。解决方案table tableNameorder columnOverride columndesc propertydescription/ /table或者在全局配置中开启自动转义property nameautoDelimitKeywords valuetrue/4.2 大文本字段处理对于BLOB/TEXT类型字段默认会生成带有JdbcType标记的代码Column(name content, jdbcType JdbcType.LONGVARCHAR) private String content;如果使用MySQL且不需要严格类型检查可以关闭此特性property nameuseJdbcTypeForNull valuefalse/4.3 多模块项目路径问题在Maven多模块项目中需要特别指定targetProject路径。假设项目结构为parent ├── dao (生成代码的目标模块) └── service配置应为javaModelGenerator targetPackagecom.example.model targetProjectdao/src/main/java/4.4 生成代码后的二次开发建议遵循以下工作流首次生成全部基础代码立即提交到版本控制标记为初始版本创建新分支进行业务开发后续表结构变更时备份自定义代码重新生成基础代码使用Git合并工具恢复业务逻辑5. 性能优化实践5.1 批量操作生成默认生成的Mapper只支持单条操作通过修改配置增加批量方法table tableNameuser property nameallowMultiQueries valuetrue/ generatedKey columnid sqlStatementMySQL identitytrue/ /table同时创建自定义插件生成批量插入方法public class BatchInsertPlugin extends PluginAdapter { Override public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable table) { Method method new Method(batchInsert); method.setReturnType(FullyQualifiedJavaType.getIntInstance()); method.addParameter(new Parameter( new FullyQualifiedJavaType(List table.getBaseRecordType() ), records)); interfaze.addMethod(method); return true; } }5.2 动态表名支持在分表场景下可以通过继承生成的Mapper接口实现动态表名public interface UserMapper extends GeneratedUserMapper { UpdateProvider(type UserSqlProvider.class, method updateByPrimaryKey) int updateWithTableName(Param(record) User record, Param(tableName) String tableName); class UserSqlProvider extends GeneratedUserSqlProvider { public String updateByPrimaryKey(MapString, Object params) { User record (User) params.get(record); String tableName (String) params.get(tableName); SQL sql new SQL() .UPDATE(tableName) // 省略其他SET条件 .WHERE(id #{record.id,jdbcTypeBIGINT}); return sql.toString(); } } }6. 与Spring Boot的深度集成6.1 自动生成RESTful接口结合Spring Data REST的思想可以扩展MBG生成基础控制器public class RestControllerPlugin extends PluginAdapter { Override public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable table) { String entityName table.getBaseRecordType(); TopLevelClass controller new TopLevelClass( entityName.replace(Entity, ) Controller); controller.addAnnotation(RestController); controller.addAnnotation(RequestMapping(\/api/ table.getTableName() \)); // 添加Autowired注入 Field mapperField new Field(); mapperField.setType(new FullyQualifiedJavaType(interfaze.getType().getShortName())); mapperField.setName(StringUtils.uncapitalize(interfaze.getType().getShortName())); mapperField.addAnnotation(Autowired); controller.addField(mapperField); // 添加基础CRUD方法 addGetMappingMethod(controller, table, mapperField); addPostMappingMethod(controller, table, mapperField); // 将控制器写入文件 JavaFormatter formatter context.getJavaFormatter(); try { File directory new File(project.getTargetProject()); File targetFile new File(directory, controller.getType().getFullyQualifiedName() .replace(., /) .java); File parent targetFile.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } try (FileOutputStream fos new FileOutputStream(targetFile)) { fos.write(formatter.getFormattedContent(controller).getBytes()); } } catch (Exception e) { throw new RuntimeException(e); } return true; } }6.2 自动生成单元测试通过扩展可以同时生成配套的SpringBootTest测试类plugin typeorg.mybatis.generator.plugins.TestCasePlugin property nametargetPackage valuecom.example.test/ property nametargetProject valuesrc/test/java/ /plugin生成的测试类会包含基础的CRUD测试案例大幅提升测试覆盖率。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →