項目地址:https://github.com/uncleAndyChen/mybatis-generator/tree/master/mybatis-generator-enhance
本擴展的作用
- 生成的*Mapper.xml文件中的腳本,表名取MBG所需配置文件中配置的值(工程中的配置文件是:generatorConfig.xml),而不是從數據庫讀取到的值。
- 給表名添加MySQL“邊界”,用 `(左上角數字鍵1左邊、Tab鍵上邊、Esc鍵下邊的鍵)引起來。
解決兩個問題
- 適應lower_case_table_names的三種配置值。
- 利用MyBatis插件,根據業務規則,對錶名進行動態替換。
注:項目根目錄下有更詳細的介紹,點擊以下鏈接查看:
- github: https://github.com/uncleAndyChen/mybatis-generator
- gitee: https://gitee.com/uncleAndyChen/mybatis-generator
自己擴展的好處
- 比起直接修改MBG源代碼,這種方式對MBG無代碼侵入,方便將來升級MBG。
- 符合面向對象設計的【開閉原則】,即通過增加代碼來爲軟件添加新功能,而不是直接修改原有代碼。這一點,MBG做得非常好,除了可以非常方便的擴展之外,還可以寫各種插件以實現自己的業務需要。
使用自己的擴展類
在配置文件generatorConfig.xml的context節點,配置runtime值,指向自己的擴展類,需要帶包名,如本例:
<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