MyBatis Generator(MBG),寫擴展類,以適應 MySQL 大小寫敏感配置的各種情況、適應分表時動態替換表名

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

本擴展的作用

  1. 生成的*Mapper.xml文件中的腳本,表名取MBG所需配置文件中配置的值(工程中的配置文件是:generatorConfig.xml),而不是從數據庫讀取到的值。
  2. 給表名添加MySQL“邊界”,用 `(左上角數字鍵1左邊、Tab鍵上邊、Esc鍵下邊的鍵)引起來。

解決兩個問題

  1. 適應lower_case_table_names的三種配置值。
  2. 利用MyBatis插件,根據業務規則,對錶名進行動態替換。

注:項目根目錄下有更詳細的介紹,點擊以下鏈接查看:

自己擴展的好處

  1. 比起直接修改MBG源代碼,這種方式對MBG無代碼侵入,方便將來升級MBG。
  2. 符合面向對象設計的【開閉原則】,即通過增加代碼來爲軟件添加新功能,而不是直接修改原有代碼。這一點,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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章