天天看點

自定義MyBatis Generator Plugin

現在可以自定來定義一個MyBatis Generator Plugin了,我們從什麼功能下手呢?在我們平時基于MySQL的資料庫對應的mapper.xml映射檔案中,在insert元素上,我們往往會定義

  

         
keyColumn="id" keyProperty="id" useGeneratedKeys="true"
           
這三個參數,在MBG中,這是可以配置的,就是在每一個table元素中使用
<generatedKey column="id" sqlStatement="JDBC"/>
           
來生成。但是如果每一個表單都要重新定義一次這個元素還是挺讨厭的,是以我們可以做一個Plugin,為所有的table的mapper.xml中的insert語句都添加這個配置。當然,這樣做會過于死闆了,是以我們也支援,如果在table元素中配置了
<property name="my.isgen.usekeys" value="true"/>
           
屬性的話,我們就忽略; 在寫插件之前,我們先考慮好插件的用法。首先這個插件是不需要參數的,即可以直接這樣配置:
<plugin type="com._520it.mybatis.plugins.UseGeneratedKeysPlugin" />
           
然後,生成的mapper.xml檔案會是這樣:
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com._520it.mybatis.domain.Account" useGeneratedKeys="true">
           
如果在table中這樣配置:
<table tableName="account">
    <property name="my.isgen.usekeys" value="true"/>
           
那麼我們的插件就忽略keyColumn;keyProperty和useGeneratedKeys三個屬性的生成; OK,插件目标定義好之後,就可以完成插件:
public class UseGeneratedKeysPlugin extends PluginAdapter {
           
首先我們的插件還是繼承PluginAdapter,因為要針對每一個mapper.xml的insert語句的生成,是以,我們選擇實作
public boolean sqlMapInsertSelectiveElementGenerated(XmlElement element,
        IntrospectedTable introspectedTable) {
           
方法。這個方法先空着,待會實作。
private static final String USEGENERATEDKEYS = "useGeneratedKeys";
private static final String KEYCOLUMN = "keyColumn";
private static final String KEYPROPERTY = "keyProperty";
private static final String IS_GEN_USEGENERATEDKEYS = "my.isgen.usekeys";
           
首先定義好需要用到的靜态字元串常量;
public boolean validate(List<String> warnings) {
    return true;
}
           
因為我們的插件沒有參數,是以驗證方法直接傳回true;
/**
 * 該方法在每一個mapper.xml檔案的insert節點生成是調用,我們要做的就是判斷是否要插入三個屬性,
 * 如果需要插入,就往XmlElement添加三個元素即可;
 */
public boolean sqlMapInsertSelectiveElementGenerated(XmlElement element,
        IntrospectedTable introspectedTable) {
    //定義是否需要生成三個屬性
    boolean isGen = true;
    //調用getTableConfigurationProperty方法,得到在目前這個table中定義的property元素
    //直接去嘗試擷取my.isgen.usekeys property;
    String isGenStr = introspectedTable
            .getTableConfigurationProperty(IS_GEN_USEGENERATEDKEYS);
    //如果得到了值,就嘗試轉化成boolean
    if (StringUtility.stringHasValue(isGenStr)) {
        isGen = Boolean.valueOf(isGenStr);
    }
    //如果需要生成參數
    if (isGen) {
        // 要使用usegeneratedkeys隻能有一個主鍵,并且主鍵的類型必須是數字類型;
        //通過introspectedTable的getPrimaryKeyColumns方法得到解析出來資料庫中的主鍵列;
        //因為主鍵列可能是多個,是以傳回的是List<IntrospectedColumn>
        List<IntrospectedColumn> keyColumns = introspectedTable
                .getPrimaryKeyColumns();
        IntrospectedColumn keyColumn = null;
        //對于usegeneratedkeys來說,隻能有一個主鍵列;
        if (keyColumns.size() == 1) {
            //得到這個唯一的主鍵列
            keyColumn = keyColumns.get(0);
            //得到這個列映射成Java模型之後的屬性對應的Java類型;
            FullyQualifiedJavaType javaType = keyColumn
                    .getFullyQualifiedJavaType();
            //usegeneratedkeys要求主鍵隻能是遞增的,是以我們把這個主鍵屬性的類型分别和Integer,Long,Short做對比;
            if (javaType.equals(PrimitiveTypeWrapper.getIntegerInstance())
                    || javaType.equals(PrimitiveTypeWrapper
                            .getLongInstance())
                    || javaType.equals(PrimitiveTypeWrapper
                            .getShortInstance())) {
                //如果是Integer,Long,Short三個類型中的而一個;則添加屬性;
                //因為我們要添加的屬性就是insert元素上的,而insert元素就是根節點,是以element就是insert元素;
                element.addAttribute(new Attribute(USEGENERATEDKEYS, "true"));
                //通過IntrospectedColumn的getActualColumnName得到列中的名稱,用于生成keyColumn屬性;
                element.addAttribute(new Attribute(KEYCOLUMN, keyColumn
                        .getActualColumnName()));
                //通過IntrospectedColumn的getJavaProperty方法得到key在Java對象中的屬性名,用于生成keyProperty屬性
                element.addAttribute(new Attribute(KEYPROPERTY, keyColumn
                        .getJavaProperty()));
            }
        }
    }
    //打完收工
    return true;
}
           
整個插件就完成了,接下來就是使用這個插件,這裡簡單提一句,比如我使用的是Mybatis Generator maven plugin來生成的,是以我需要把我自定義的插件所在的項目使用mvn install先打包,然後在要生成的具體項目的pom檔案中添加:
<plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.0</version>
            <configuration>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.3.0</version>
                </dependency>
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.3.2</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.21</version>
                </dependency>
                <!--把自己的插件引入到MBG Maven Plugin的依賴中 -->
                <dependency>
                    <groupId>com._520it</groupId>
                    <artifactId>mybatis-plugins</artifactId>
                    <version>1.0.0</version>
                </dependency>
            </dependencies>
        </plugin>
           
這樣再使用mvn mybatis-generator:generate就可以了; 至此,MBG簡單的通過Plugin的擴充機制就完成了,接下來就是通過extends的方式擴充MGB,和MBG的代碼結構分析了。 作者:小碼哥Java學院 連結:http://www.jianshu.com/p/426047adf42c 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。