1. 程式人生 > >Mybatis-generator修改原始碼實現自定義方法,返回List物件(三)

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了,
那麼我們的目的就達到了,歡迎留言共同探討