本文实现方式是修改 MyBatis Generator 源码,最新的实现方式是通过 MyBatis Generator 扩展来实现,点击前往。
官方文档:Identifier Case Sensitivity
参数说明
lower_case_table_names=0
表名存储为给定的大小写。比较时:区分大小写。大小写敏感(Unix,Linux默认)。创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm。SQL语句也会原样解析。
lower_case_table_names=1
表名存储为小写。比较时:不区分大小写。大小写不敏感(Windows默认)。创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。SQL语句同样会将库表名转换成小写。如需要查询以前创建的Test_table(生成Test_table.frm文件),即便执行select * from Test_table,也会被转换成select * from test_table,致使报错表不存在。
lower_case_table_names=2
表名存储为给定的大小写。比较时:小写。创建的库表将原样保存在磁盘上。但SQL语句将库表名转换成小写。
如果开发环境、生产环境均配置成1或者2,则本文中有关大小写敏感的修改都是无意义的。
但是如果分库时依赖表名替换,则又是适用的,见以下【适用场景】中的场景二。
最终目标:MBG 生成的xml文件中的sql脚本的表名,保持与对应表名在建表时的大小写一致,保持大小写敏感(表名可在MBG需要的配置文件中配置,以该配置为准)。这样可以适应以上lower_case_table_names
的三种配置值。
为了达到以上目标,运行生成表配置内容的项目,一定要连接参数lower_case_table_names
配置为0或者2的数据库服务器,并且是配置为0或者2之后才创建的数据表,否则,生成的表配置内容的表名,是以全部小写为基准的,并非驼峰式命名法。表配置内容生成好之后,重新生成 mapper 时连接的数据库服务器的lower_case_table_names
配置值,对生成结果没有影响。
lower_case_table_names=1
,且该参数不能修改。lower_case_table_names
的linux服务器,就可以将该参数设置为0,即大小写敏感。lower_case_table_names=0
(linux)或者lower_case_table_names=2
(windows)的情况。当然,读到这里,你可能会觉得奇怪,数据库的库名、表名、字段名,业界都是用下划线分开的,其余字母全是小写,所以,该参数被配置成什么都不需要关心。
如果你也这么认为,那么,本文对你是没有价值的。
本文要解决的问题是,数据库的库名、表名、字段名,需要保持跟 Java 的编码规范一致的场景。如果都统一成一种编码规则,比如统一用驼峰式命名法,那么,不用在两种编码习惯上切换,可以提高编码效率和减少不必要的麻烦,且继续往下看。
erpTrade
表分成了120个表,那么在某一次业务操作中,需要将erpTrade
替换成erpTrade_xyz
,其中xyz
为从001
到120
的其中一个数字,则需要将MBG生成的xml里sql脚本中的表名用 `(左上角数字键1左边、Tab键上边、Esc键下边的键)引起来。将会分享我的基于 MyBatis 插件分库分表项目。
lower_case_table_names=1
或者该参数未配置(未配置的时候默认为1),运行MBG,生成的sql脚本,全是小写,需要花费额外时间来解决环境问题。废话少说,下面切入正题。
笔者写这篇文章的时候,Release 最新版本是1.3.5(2016年九月7号发布),该版本已经足够满足本文提到的需求了,作者主导的项目均采用该版本。
关于 MBG 的介绍,看官网文档足够了,本文的重点是修改源代码,让 MBG 在生成的代码里,对应的类和 mapper 文件保持与对应的表名大小写不变。
备注,实现方式已经改为通过扩展来解决问题了,不过,如果需要研究一下源码,还是有必要往下读的。
作为研究,作者去mybatis/generator 官方 github 下载了最新版 V1.3.7(2018年7月5号发布),用最新版重新操作了一遍。
下载的源码文件是generator-mybatis-generator-1.3.7.zip,解压之后,找到目录 generator-mybatis-generator-1.3.7\core\mybatis-generator-core
,这个目录就是我们需要的源码目录。该目录下,只保留 src 目录和 pom.xml,其余删除。
用 IDEA 导入项目,如果依赖下载很慢,建议添加阿里云仓库,在 pom.xml,倒数第二行后面、最后一行
前面,插入以下内容:
maven-ali
http://maven.aliyun.com/nexus/content/groups/public/
true
true
always
fail
才下操作,均针对最新版 v1.3.7。
一共需要修改 org.mybatis.generator.api.IntrospectedTable 这个类的两个方法。
/**
* Gets the fully qualified table name at runtime.
*
* @return the fully qualified table name at runtime
*/
public String getFullyQualifiedTableNameAtRuntime() {
// return internalAttributes
// .get(InternalAttribute.ATTR_FULLY_QUALIFIED_TABLE_NAME_AT_RUNTIME);
return this.getTableConfiguration().getTableName();
}
/**
* Gets the aliased fully qualified table name at runtime.
*
* @return the aliased fully qualified table name at runtime
*/
public String getAliasedFullyQualifiedTableNameAtRuntime() {
// return internalAttributes
// .get(InternalAttribute.ATTR_ALIASED_FULLY_QUALIFIED_TABLE_NAME_AT_RUNTIME);
return this.getTableConfiguration().getTableName();
}
这两个方法里面的前两行注释了的代码是官方的,最后那行代码是修改之后的。
create schema if not exists mbg default character set utf8;
use mbg;
set names utf8;
drop table if exists erpTrade;
create table erpTrade
(
tradeID int not null auto_increment,
tid bigint comment '订单号',
shopID int,
memberID bigint comment '针对的会员ID,同步会员时反写',
buyerNick national varchar(50),
sellerID bigint comment '店铺用户,主旺旺 ID',
primary key (tradeID)
);
drop table if exists erpEnterpriseMember;
create table erpEnterpriseMember
(
memberID bigint not null auto_increment,
shopID int,
nickname varchar(50) comment '会员昵称',
realName varchar(50) comment '真实姓名',
sex int comment '性别 1.男 2.女 3.未知',
created int,
modified int,
primary key (memberID)
);
drop table if exists erpShopConfig;
create table erpShopConfig
(
ID int not null auto_increment,
shopID int,
mobile varchar(200) comment '接收短信手机号,多个以逗号隔开',
email varchar(200) comment '邮箱地址,多个以逗号隔开',
isNotifyBalanceLess int comment '当短信账户余额为X条时,系统免费发送短信提醒您及时充值。',
balanceLessValue int comment '余额不足提醒值',
isNotifyBeforeExpire int comment '是否发送软件快到期提醒',
beforeDaysExpire int comment '软件快到期提醒时间,提前天数',
created int,
modified int,
primary key (ID)
);
MBG 基于一个 xml 配置文件,在这个配置文件里,有跟表相关的配置,为了达到我的需求,需要一张表对应一行配置信息,所以,我写了一个类来自动生成,这样,在增减表,或者别的项目里面,可以简单的运行这个类来生成,减少手工劳动。
更详细的,请看:https://github.com/uncleAndyChen/mybatis-generator/tree/master/create-table-property
MBG需要的配置文件比较全面的,在工作中实际用到的文件内容如下:
<generatorConfiguration>
<classPathEntry location="mysql-connector-java-5.1.31.jar"/>
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://192.168.0.130:3306/mbg?useUnivalue=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false"
userId="root" password="root">
jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
javaTypeResolver>
<javaModelGenerator targetPackage="mybatis.generator.model.entity" targetProject="mybatis.generator.model/src/main/java/">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="mappers\original" targetProject="mybatis.generator.dal\src\main\resources">
<property name="enableSubPackages" value="true"/>
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.generator.dal.mapper"
targetProject="mybatis.generator.dal/src/main/java/">
<property name="enableSubPackages" value="true"/>
javaClientGenerator>
<table tableName="erpEnterpriseMember" domainObjectName="EnterpriseMember"><property name="useActualColumnNames" value="true"/><generatedKey identity="true" type="post" column="memberID" sqlStatement="Mysql"/>table>
<table tableName="erpShopConfig" domainObjectName="ShopConfig"><property name="useActualColumnNames" value="true"/><generatedKey identity="true" type="post" column="ID" sqlStatement="Mysql"/>table>
<table tableName="erpTrade" domainObjectName="erpTrade"><property name="useActualColumnNames" value="true"/><generatedKey identity="true" type="post" column="tradeID" sqlStatement="Mysql"/>table>
context>
generatorConfiguration>
新建一个启动应用,选 MBG 下的 ShellRunner 作为启动入口
按下图所示,在参数一栏写:-configfile generatorConfig.xml -overwrite,选 mybatis-generator-1.3.5 模块
接下来,应该知道如何运行或者调试了吧。
java -Dfile.encoding=UTF-8 -cp mybatis-generator-1.3.5.jar org.mybatis.generator.api.ShellRunner -configfile generatorConfig.xml -overwrite
按 Ctrl+Alt+Shift+s,进入项目设置界面
生成 MBG jar 包第一步,配置
生成 MBG jar 包第二步,Build Artifacts…
# 注意:*Mapper.xml 文件,每次重新生成都需要先删除,否则部分内容会重复生成,导致错误
del/f/s/q C:\workspace\mbg\mybatis-generator\demo-domain-dal\src\main\java\demo\domain\dal\mapper\original\*.*
del/f/s/q C:\workspace\mbg\mybatis-generator\demo-domain-model\src\main\java\demo\domain\model\entity\*.*
del/f/s/q C:\workspace\mbg\mybatis-generator\demo-domain-dal\src\main\resources\mappers\original\*.xml
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