Mybatis-generator修改原始碼實現自定義方法,返回List物件(三)
前兩篇文章我們講了如何獲取原始碼即建立工程、修改原始碼為dao(mapper)層新增一個方法,那麼這一篇,我們來講如何在xml新增這個方法所需要sql
3、實現XML檔案新增Dao(Mapper)層的實現
前面有講過,下圖中的兩個包,分別是管理dao(Mapper)檔案和xml檔案的,
之前我們已經介紹了javamapper這個包了,而且在dao層添加了方法,那麼我們現在來講xmlmapper這個包,跟前面的很像,這個包下面有個XMLMapperGenerator類,裡頭有個getSqlMapElement方法,它也有很多的addxxx的方法,
而這些方法裡頭呼叫的,是org.mybatis.generator.codegen.mybatis3.xmlmapper.elements包下面類的物件
如果第二篇的物件你已經完成了,那麼這裡要做的,其實和第二篇差不多了,
我們先在elements包裡,用SelectByPrimaryKeyElementGenerator類複製出來一個,類名叫SelectByObjectElementGenerator,這個類裡的內容,我們等會兒再來修改,
先去XMLMapperGenerator類新增一個方法
//自定義方法
protected void addSelectByObject(XmlElement parentElement) {
if (introspectedTable.getRules().generateSelectByPrimaryKey()) {
AbstractXmlElementGenerator elementGenerator = new SelectByObjectElementGenerator();
initializeAndExecuteGenerator(elementGenerator, parentElement);
}
}
然後在該類的getSqlMapElement方法中呼叫這個方法
那麼這樣做完以後,理論上新生成的xml檔案,就會多出一個了,但是裡頭面的sql依然是SelectByPrimaryKey方法的sql,接下去,我們就去修改SelectByObjectElementGenerator類的addElements方法,將其改為我們所需要的sql。
@Override
public void addElements(XmlElement parentElement) {
//先建立一個select標籤
XmlElement answer = new XmlElement("select" ); //$NON-NLS-1$
//設定該select標籤的id,正式第二篇裡在列舉中設定的值
answer.addAttribute(new Attribute("id", introspectedTable.getSelectByObject()));
//新增parameterType
String parameterType;
if (introspectedTable.getRules().generateRecordWithBLOBsClass()) {
parameterType = introspectedTable.getRecordWithBLOBsType();
} else {
parameterType = introspectedTable.getBaseRecordType();
}
answer.addAttribute(new Attribute("parameterType", parameterType));
//設定resultMap為BaseResultMap
answer.addAttribute(new Attribute("resultMap",introspectedTable.getBaseResultMapId()));
context.getCommentGenerator().addComment(answer);
//接下去是拼接我們的sql
StringBuilder sb = new StringBuilder();
sb.append("select ");
Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns().iterator();
//迴圈插入欄位名稱
while (iter.hasNext()) {
sb.append(MyBatis3FormattingUtilities.getSelectListPhrase(iter.next()));
if (iter.hasNext()) {
sb.append(", ");
}
if (sb.length() > 80) {
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
}
}
if (sb.length() > 0) {
answer.addElement((new TextElement(sb.toString())));
}
sb.setLength(0);
sb.append("from ");
sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());
answer.addElement(new TextElement(sb.toString()));
//在這裡新增where條件
XmlElement selectTrimElement = new XmlElement("trim"); //設定trim標籤
selectTrimElement.addAttribute(new Attribute("prefix", "where"));
selectTrimElement.addAttribute(new Attribute("prefixOverrides", "and")); //新增where和and
answer.addElement(selectTrimElement);
//迴圈所有的列
for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
XmlElement selectNotNullElement = new XmlElement("if"); //$NON-NLS-1$
sb.setLength(0);
sb.append(introspectedColumn.getJavaProperty());
sb.append(" != null ");
selectNotNullElement.addAttribute(new Attribute("test", sb.toString()));
sb.setLength(0);
sb.append(" and "); //新增and
sb.append(MyBatis3FormattingUtilities
.getEscapedColumnName(introspectedColumn));
sb.append(" = "); //新增等號
sb.append(MyBatis3FormattingUtilities
.getParameterClause(introspectedColumn));
selectNotNullElement.addElement(new TextElement(sb.toString()));
selectTrimElement.addElement(selectNotNullElement);
}
//
String orderByClause = introspectedTable.getTableConfigurationProperty(PropertyRegistry.TABLE_SELECT_ALL_ORDER_BY_CLAUSE);
boolean hasOrderBy = StringUtility.stringHasValue(orderByClause);
if (hasOrderBy) {
sb.setLength(0);
sb.append("order by "); //$NON-NLS-1$
sb.append(orderByClause);
answer.addElement(new TextElement(sb.toString()));
}
if (context.getPlugins().sqlMapSelectAllElementGenerated(
answer, introspectedTable)) {
parentElement.addElement(answer);
}
}
修改完成以後,儲存,執行MyTestRun,再檢視xml檔案,就會看到
這樣,我們在使用dao(Mapper)層的SelectByObject方法的時候,就會呼叫這條sql了,
那麼我們的目的就達到了,歡迎留言共同探討