現在可以自定來定義一個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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。