MyBatis Generator(MBG),写扩展类,以适应 MySQL 大小写敏感配置的各种情况、适应分表时动态替换表名

MyBatis核心原理与Spring Boot集成实战:从SQL映射到动态查询 在Java后端开发中,数据持久化是构建稳定应用的核心基础。从最基础的JDBC手动处理连接与结果集,到ORM框架对对象关系映射的抽象,开发者始终在追求效率与灵活性的平衡。MyBatis作为一种半自动化的持久层框架,其核心价值在于将SQL的控制权交还给开发者,同时通过参数映射、结果集映射等机制大幅简化了数据库操作。它通过XML或注解配置实现SQL与Java代码的解耦,支持动态SQL构建,并能与Spring生态无缝集成,极大地提升了工程实践中的开发效率和代码可维护性。这种设计使其特别适用于对SQL优化有较高要求、 阅读详情

项目地址:https://github.com/uncleAndyChen/mybatis-generator/tree/master/mybatis-generator-enhance

运行本工程生成表配置内容,一定要连接参数lower_case_table_names配置为0或者2的数据库服务器,并且是配置为0或者2之后才创建的数据表,否则,生成的表配置内容的表名,全是小写的,并非驼峰式命名法。表配置内容生成好之后,重新生成 mapper 时连接的数据库服务器的lower_case_table_names配置值,对生成结果没有影响。

本文对应的完整项目

进入以上项目路径可查看更详细的介绍。

本扩展的作用

2019-06-19 更新

  1. 生成的*Mapper.xml文件中的脚本,表名取MBG所需配置文件中配置的值(工程中的配置文件是:generatorConfig.xml),而不是从数据库读取到的值。
    • 如果数据库表名采用下划线命名法,请忽略这个作用。
    • 数据库表名、字段名命名法:
      • 之前本人推荐采用驼峰命名法。
        • 想要保持统一的命名规则。
        • 不知道通过配置的方式兼顾两种命名法,即数据库表名、字段名在采用下划线命名法的情况下,通过 MBG 生成的对应每一个表的 POJO 采用驼峰命名法,查询数据时不需要考虑 MBG 生成的 xml 映射文件中的 resultMap,如 parent_id 与 parentId 的映射。
      • 现在推荐下划线命名法。
        • 这是为了避免因 windows 与 linux 以及云数据库的大小写敏感不一致,从而带来不必要的麻烦。
        • 同时也是考虑到绝大多数同行的习惯。
        • 最主要的,是解决了之前不知道的兼顾两种命名法的办法(好象有一点拗口~~)
  2. 给表名添加MySQL“边界”,用 `(左上角数字键1左边、Tab键上边、Esc键下边的键)引起来。目的是分表时进行表名替换,把每张个表的表名当作一个整体,避免表名补充部分替换。

解决两个问题

  1. 适应lower_case_table_names的三种配置值。
  2. 利用MyBatis插件,根据业务规则,对表名进行动态替换。

自己扩展的好处

  1. 比起直接修改MBG源代码,这种方式对MBG无代码侵入,方便将来升级MBG。
  2. 符合面向对象设计的【开闭原则】,即通过增加代码来为软件添加新功能,而不是直接修改原有代码。这一点,MBG做得非常好,除了可以非常方便的扩展之外,还可以写各种插件以实现自己的业务需要。

自己扩展的好处

  1. 比起直接修改MBG源代码,这种方式对MBG无代码侵入,方便将来升级MBG。
  2. 符合面向对象设计的【开闭原则】,即通过增加代码来为软件添加新功能,而不是直接修改原有代码。这一点,MBG做得非常好,除了可以非常方便的扩展之外,还可以写各种插件以实现自己的业务需要。

使用自己的扩展类

在配置文件 generatorConfig.xml 的 context 节点,配置 targetRuntime 值,指向自己的扩展类,需要带包名,如本例:

<context id="Mysql" targetRuntime="mybatis.generator.enhance.IntrospectedTableEnhanceImpl" defaultModelType="flat">

扩展类的代码很简单,只有十几行

import org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl;

public class IntrospectedTableEnhanceImpl extends IntrospectedTableMyBatis3Impl {
    @Override
    public String getFullyQualifiedTableNameAtRuntime() {
        return getTableNameFromConfigFile();
    }

    @Override
    public String getAliasedFullyQualifiedTableNameAtRuntime() {
        return getTableNameFromConfigFile();
    }

    private String getTableNameFromConfigFile() {
        String tableName = this.getTableConfiguration().getTableName();
        return "`" + tableName + "`";
    }
}

两种运行方式

以程序方式运行

仿照官方的org.mybatis.generator.api.ShellRunner,写一段代码,以程序的方式运行。本工程的代码如下:

public class GeneratorEnhanceRun {
    public static void main(String[] args) {
        try {
            List<String> warnings = new ArrayList<String>();
            /**
             * 初始化配置解析器
             */
            ConfigurationParser cp = new ConfigurationParser(warnings);

            /**
             * 获取配置文件信息
             */
            FileInputStream fileInputStream = new FileInputStream(ConfigProperties.getValue("configFile"));

            /**
             * 调用配置解析器创建配置对象
             */
            Configuration config = cp.parseConfiguration(fileInputStream);
            /**
             * shellcallback接口主要用来处理文件的创建和合并,传入overwrite参数;默认的shellcallback是不支持文件合并的;
             */
            DefaultShellCallback callback = new DefaultShellCallback(true);
            /**
             * 创建一个MyBatisGenerator对象。MyBatisGenerator类是真正用来执行生成动作的类
             */
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            /**
             * 用System.out打印执行过程
             */
            ProgressCallback progressCallback = new VerboseProgressCallback();

            /**
             *  执行生成操作
             */
            myBatisGenerator.generate(progressCallback);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本工程,直接运行GeneratorEnhanceRun下的main方法,在运行之前需要先修改resources目录下的配置文件application.properties,将MBG运行需要的配置文件路径配置对。

configFile=C:/workspace/mbg/mybatis-generator/generatorConfig.xml

cmd窗口运行jar文件

  • 下MBG的jar包,传送门,解压,找到mybatis-generator-1.3.7.jar备用。
  • 将本模块生成jar文件,生成的jar文件名mybatis-generator-enhance.jar。
  • 将两个jar文件以及配置文件放到model与dal项目所在的目录下,在 cmd 窗口执行:
java -Dfile.encoding=UTF-8 -cp mybatis-generator-1.3.7.jar;mybatis-generator-enhance.jar org.mybatis.generator.api.ShellRunner -configfile generatorConfig.xml -overwrite

这里通过 -cp 指定需要用到的所有jar包,用分号隔开,这样在运行的时候才能找到相应的类。

原理

简单的说,就是自己的实现类IntrospectedTableEnhanceImpl继承自MBG的一个具体实现类,重写获取表名的方法。

IntrospectedTable是MBG提供的一个比较基础的扩展类,相当于可以重新定义一个runtime。如果要通过继承IntrospectedTable完成扩展,需要自己来实现生成XML和Java代码的所有代码,也可以直接继承IntrospectedTableMyBatis3Impl,重写自己需要的业务逻辑,本模块就是直接继承自该类。

要扩展自己的业务逻辑,建议先仔细阅读IntrospectedTableMyBatis3Impl和IntrospectedTableMyBatis3SimpleImpl,这两个类用得多一些。

在MBG中,提供了几种默认的IntrospectedTable的实现,其实在context上设置的runtime对应的就是不同的IntrospectedTable的实现,下面是几种runtime和对应的实现类:

  • MyBatis3 (default):org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl
  • MyBatis3Simple:org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3SimpleImpl
  • Ibatis2Java2:org.mybatis.generator.codegen.ibatis2.IntrospectedTableIbatis2Java2Impl
  • Ibatis2Java5:org.mybatis.generator.codegen.ibatis2.IntrospectedTableIbatis2Java5Impl

MySQL 数据库驱动版本与数据库版本问题

用高版本的数据库驱动mysql-connector-java 8.0.13连接低版本数据库MySQL 5.7.23,会有以下问题:

  1. 报错
    Cannot obtain primary key information from the database, generated objects may be incomplete
    ...
    
  2. 生成的 mapper 缺少以下接口:
    deleteByPrimaryKey
    selectByPrimaryKey
    updateByPrimaryKeySelective
    updateByPrimaryKey
    

解决

数据库驱动与数据库版本匹配即可,作者在以下两个版本(5.x与8.x)测试通过:

  1. 数据库驱动mysql-connector-java 8.0.13连接数据库MySQL 8.0.11,对应driverClassName: com.mysql.cj.jdbc.Driver
  2. 数据库驱动mysql-connector-java 5.1.29连接数据库MySQL 5.7.23,对应driverClassName: com.mysql.jdbc.Driver

本工程的数据库驱动版本,使用的是当前最新的mysql-connector-java 8.0.13,仅支持连接高版本MySQL 8.x。

如果要在MySQL 5.7.x下运行,只需要修改以下两个地方(注意是5.7.x,其它5.x版本没测试):

  1. 修改pom.xml中mysql-connector.version,改为低版本5.1.39。
  2. 本项目的执行,依赖根目录下的generatorConfig.xml文件,将其中driverClass,由com.mysql.cj.jdbc.Driver改为com.mysql.jdbc.Driver。

关于作者

MyBatis核心原理与实战:从零掌握半自动ORM框架 ORM(对象关系映射)是Java后端开发中连接应用与数据库的核心技术,它通过将数据库表映射为Java对象,简化了数据持久化操作。其原理在于框架在运行时自动处理SQL生成、参数绑定和结果集映射,从而提升开发效率。MyBatis作为一款半自动ORM框架,其技术价值在于平衡了开发便利性与SQL控制力,它允许开发者直接编写和优化SQL,同时自动处理对象映射,这在处理复杂查询、性能优化及对接非标准数据库结构时优势明显。应用场景广泛覆盖从基础CRUD到动态SQL、关联查询等企业级数据访问需求。本文聚焦MyBatis,深 阅读详情

相关推荐

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

本文我们主要实战Mybatis官方的代码生成器:Mybatis Generator(MBG),掌握它以后,可以简化大部分手写代码,我们只需要写复杂逻辑代码!创建与MySQL表对应的Java PO对象,字段一一对应;创建Mapper接口,和对应的XML映射文件(或注解)。首先是PO对象,我们往往创建与数据库表字段一一对应的PO对象;其次在Mapper里,通常都会写基本的增删改查代码。本文就带大家实战一下Mybatis Generator,用它生成实战项目全部表的PO对象和基本增删改查代码!

天罡gg的专栏 3万+

解决表字段使用关键字导致Mybatis Generator生成代码异常的解决方案

From: http://blog.itfsw.com/2017/05/23/jiejue-biao-ziduan-shiyong-guanjianzi-daozhi-mybatis-generator-shengcheng-daima-yichang-de-jiejue-fangan/ 在某个项目中遇到这么一个问题,因为原始表结构中某些字段定义使用了MySQL的关键字如match等,在使用My...

JoeBlackZQQ的专栏 1702

开源bbs源码java-mybatis-generator:MyBatisGenerator(MBG),写扩展类,以适应MySQL大小写敏感配

开源 bbs 源码 java 需求场景 数据库表名和字段名使用驼峰式命名法,解决在生成的 sql 语句中字段名全部变为小写的问题。 虽然我不推荐这种命名方式,但是如果你要坚持,好吧,这个项目能帮到你~~ 分表时做表名替换,实现方式,请参考: 。 基于 MyBatis 的分库分表项目 ,用到了本项目的 说明 曾尝试将数据库表名、字段名也采用驼峰命名法。 现在已经改成: 数据库表名、字段名保持下划线命名法。 针对自定义 SQL 查询结果,对应的自定义 POJO 保持驼峰命名法,查询数据库的 SQL 语句保留原生下划线,并且不用写 resultMap。 做到了 Java 规范与 MySQL 命名规范不一致的完美兼顾。 已添加查询示例,不过仅仅是查询示例,没有考虑到项目架构的合理性。实际项目不会在 web 层直接调用 dal 层,实际项目会有业务层和接口层。 有关 MySQL 命名规范,请参考:,请关注这篇文章提到的 mapUnderscoreToCamelCase 配置项。 运行示例 安装 MySQL,执行 boot-create-table-property/resources/schem

MyBatis Generator自动生成实体代码

MyBatis Generator自动生成实体代码首先新建一个Maven工程Maven配置如下<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sche

王小军的博客 3398

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 790

Kali Linux实战:Aircrack-ng破解Wi-Fi密码的完整流程与常见问题解决

本文详细介绍了在Kali Linux中使用Aircrack-ng套件进行Wi-Fi密码破解的完整流程,包括环境准备、无线网卡配置、网络扫描、握手包捕获与字典破解等关键步骤。同时针对无线网卡不支持监听模式、无法捕获握手包等常见问题提供了实用解决方案,帮助安全研究人员有效评估无线网络安全性。

weixin_29323049的博客 296

generatorConfiguration配置详解

这里通过一个例子说明。假设在MySQL数据库中有一个表名为userinfo,你没有看错,中间是一个空格,这种情况下如果写出select*fromuserinfo这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子select*from。...

zzz的博客 5507

​开源大模型实战:GLM-4.1V-Thinking本地部署教程(附API调用代码)

​在AI应用从“能用”向“好用”进阶的当下,​的需求愈发强烈:企业需保障数据安全(如医疗影像、金融报告不外传),开发者追求定制化能力(如微调模型适配垂直场景),科研团队则依赖离线环境处理敏感数据。智谱AI开源的​(10B级参数,支持图像、视频、文档多模态推理)凭借的优势,成为本地部署的热门选择。不过,对于“不想折腾技术”的普通用户或快速验证需求的团队而言,​,无需安装配置,打开即用,堪称“零门槛”体验的捷径。本文将分为两部分:先手把手教你​(适合有技术背景的用户),再对比介绍。

gogoMark的博客 1340

MyBatis Generator (MBG),写扩展类,以适应 MySQL 大小写敏感配置的各种情况、适应分表时动态替换表名

运行本工程生成表配置内容,一定要连接参数lower_case_table_names配置为0或者2的数据库服务器,并且是配置为0或者2之后才创建的数据表,否则,生成的表配置内容的表名,全是小写的,并非驼峰式命名法。表配置内容生成好之后,重新生成 mapper 时连接的数据库服务器的lower_case_table_names配置值,对生成结果没有影响。 本文对应的完整项目 github: https://github.com/uncleAndyChen/mybatis-generator gitee: ht

斯旺森swanson 507

Ubuntu 24.04 LTS与Windows 11远程桌面连接:从xrdp闪退到xfce4桌面环境的实战排障

本文详细解决了在Ubuntu 24.04 LTS上使用xrdp连接Windows 11远程桌面时遇到的登录后闪退问题。通过分析日志,定位到默认GNOME桌面环境与xrdp的兼容性冲突,并提供了将桌面环境更换为轻量且兼容性更佳的XFCE4的完整实战解决方案,包括安装、关键配置修改及服务重启步骤,确保远程连接稳定可靠。

mango的博客 807

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

@tablegenerator mysql_MyBatis Generator (MBG),写扩展类,以适应 MySQL 大小写敏感配置的各种情况、适应分表时动态替换表名...

运行本工程生成表配置内容,一定要连接参数lower_case_table_names配置为0或者2的数据库服务器,并且是配置为0或者2之后才创建的数据表,否则,生成的表配置内容的表名,全是小写的,并非驼峰式命名法。表配置内容生成好之后,重新生成 mapper 时连接的数据库服务器的lower_case_table_names配置值,对生成结果没有影响。本文对应的完整项目进入以上项目路径可查看更详细...

weixin_39703982的博客 134

软件需求规格说明书(SRS)深入解析

摘要: SRS(软件需求规格说明书)是定义系统功能、性能与接口的核心文档,为开发、测试、项目管理提供依据。标准结构包括引言、总体描述、功能/非功能需求、接口等模块。撰写需确保清晰、可验证、无歧义,避免模糊术语。示例展示学生注册模块的需求写法,强调性能与安全性要求。推荐使用Confluence、StarUML等工具辅助编写,交付时需包含主文档、原型图及需求跟踪矩阵。SRS应兼具技术性与管理性,作为沟通桥梁和验收标准。

moton2017的博客 2928

MyBatis Generator (MBG),修改源码以适应 MySQL 大小写敏感配置的各种情况、适应分表时动态替换表名

本文对应的示例代码,已托管到码云:mybatis-generator需求场景 首先,我项目的 Java 代码规范是变量命名应用驼峰式命名法(Camel-Case)。数据库表名及字段名,则用下划线命名法(即用下划线分隔不同单词)。 我用 MBG 生成的代码,通过配置可以将下划线去掉,同时将下划线后的第一个字母转为大写,这样是符合驼峰式命名法的。 但是,问题来了。我们项目前后端分离,前端调用 Restf

Where there is a will there is a way 4294

做cellchat画图时自环的角度颠倒,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 464

18、社区多能源管理与点对点能源交易优化调度策略研究

本文研究了社区多能源管理与点对点(P2P)能源交易的优化调度策略,构建了适用于单一社区多个产消者的P2P交易模型,以用户生产成本最小化为目标,设计了基于ADMM算法的迭代优化方法。通过电热联合调度与能源共享机制,结合光伏、热电联产(CHP)和储能系统(ESS),实现了用户侧能源的高效利用。仿真结果表明,引入P2P交易和CHP设备显著降低了用户能源成本,提高了电力自给率和天然气利用率,减少了对主电网的依赖。研究验证了ADMM算法在分布式优化中的有效性,为未来社区能源系统的智能化管理提供了理论支持和技术路径。

git9versioner的博客 71

mysql分表动态扩展_mybatis-generator

说明本项目最初想要解决数据库表名、字段名的命名法与 java 的类、属性命名法不一致带来的一系列问题。当然,本项目的 MBG 扩展类还做了一些其他事情,比如方便分表时做表名替换,更详细的,请参考: MBG 扩展类 module曾尝试将数据库表名、字段名也采用驼峰命名法。现在已经改成:数据库表名、字段名保持下划线命名法。针对自定义 SQL 查询结果,对应的自定义 POJO 保持驼峰命名法,查询数据库...

weixin_31812189的博客 575

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

第三章 mybatis-generator + mysql/ptsql

用了mybatis-generator,我就不再想用注解了,这与我之前说的注解与XML并用是矛盾的,知识嘛,本来就是多元化的,今天喜欢这个,明天喜欢那个,哈哈,看了mybatis-generator下边的作用,再决定用哪个。 mybatis-generator的作用: 生成model、mapper接口、mapper对应的xml文件(包含基本的增删该查与条件不定式的插入、更新和查询) 在项...

weixin_34177064的博客 578

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MyBatis Generator PostgreSQL逆向生成 区分大小写敏感

MyBatis Generator PostgreSQL逆向生成 区分大小写敏感 PostgreSQL使用说明区分大小写敏感 PostgreSQL对所有数据库标识符(表名,模式名,列名等)区分大小写。此外,PostgreSQL对所有小写字母的所有标识符都有不同的偏好。如果您使用PostgreSQL的所有小写标识符,那么MyBatis Generator将找到表并写入正确的SQL,而无需额外考虑。如...

weixin_42051852的博客 1017

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mybatis_gennerator

this is EntityUtil private static final Logger logger = LoggerFactory .getLogger(EntityUtil.class); private final String type_char = "char"; private final String type_date = "dat

liuli_1234567890的专栏 559

MyBatis 三剑客之一 Mybatis Generator

官方网站:https://mybatis.org/generator/ 通用 Mapper 的 MBG:https://github.com/abel533/Mapper/wiki/4.1.mappergenerator 参考:https://blog.youkuaiyun.com/q258523454/article/details/82292045 MyBatis Generator 简称 MBG,是 MyBatis 官方发布的代码生成器,它可以根据数据库的表生成对应的实体类,xml文件和mapper接口,提高开发

imonkeyi的博客 420

mybatis 字段名自动转小写_Mybatis 通用 Mapper Mapper

一、通用 Mapper 的用途 ?我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字段变化很频繁,就需要反复重新生成代码,并且由于 MBG 覆盖生成代码和追加方式生成 XML,导致每次重新生成都需要大量的比对修改。除了这个问题外,还有一个问题,仅仅基础的增删改查等方法,就已经产生了大量...

weixin_31091881的博客 1880

MyBatis最佳实践之——MBG代码生成工具

MyBatis也提供了一个代码生成器,叫做MyBatis Generator,简称MBG

yuiezt的专栏 601

Mybatis----MyBatis Generator (MBG)简介

Mybatis----MyBatis Generator (MBG)简介 MyBatis Generator (MBG)简介 MBG生成代码文件 MBG Quick Start Guide MBG配置文件示例 MBG运行方式 1.From a Command Prompt 2.Running MyBatis Generator ...

大魔王 1913

Mybatis 逆向工程

一、修改 pom.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.a

dingd1234的博客 367
上一篇: react开发,日常经验汇总
下一篇: WebStorm + React 项目,配置 ESLint
uncleAndyChen
博客等级 码龄22年 32粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值