您好,登錄后才能下訂單哦!
怎樣使用MyBatis輕松實現遞歸查詢與存儲過程調用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
由于部門的層級不可控,因此如果我想要獲取所有部門的完整json的話,就要采用遞歸調用,使用Java代碼處理遞歸有點low,剛好MyBatis的ResultMap中的collection可以很方便的解決這個問題,核心代碼如下:
<resultMap id="BaseResultMap" type="org.sang.bean.Department"> <id property="id" column="id"/> <result column="name" property="name"/> <result column="parentId" property="parentId"/> <result column="isParent" property="isParent"/> <collection property="children" ofType="org.sang.bean.Department" select="org.sang.mapper.DepartmentMapper.getDepByPid" column="id"> </collection> </resultMap> <select id="getDepByPid" resultMap="BaseResultMap"> select d1.*from department d1 where d1.`parentId`=#{pid} AND d1.enabled=true; </select>
每一個Department中都有一個children屬性,getDepByPid方法的返回結果是一個BaseResultMap,BaseResultMap中的collection又將調用getDepByPid方法,通過這種方式我們可以快速實現一個遞歸調用。Mapper中只需要定義如下方法即可:
List<Department> getDepByPid(Long pid);
查詢結果如下(部分):
[ { "id": 1, "name": "股東會", "parentId": -1, "enabled": true, "children": [ { "id": 4, "name": "董事長", "parentId": 1, "enabled": true, "children": [ { "id": 5, "name": "總經理", "parentId": 4, "enabled": true, "children": [ { "id": 8, "name": "財務部", "parentId": 5, "enabled": true, "children": [], "parent": false }], "parent": true } ], "parent": true } ], "parent": true } ]
存儲過程調用比較簡單,以添加部門為例,如下:
1.Mapper中添加如下方法:
void addDep(@Param("dep") Department department);
2.xml中寫法如下:
<select id="addDep" statementType="CALLABLE"> call addDep(#{dep.name,mode=IN,jdbcType=VARCHAR},#{dep.parentId,mode=IN,jdbcType=INTEGER},#{dep.enabled,mode=IN,jdbcType=BOOLEAN},#{dep.result,mode=OUT,jdbcType=INTEGER},#{dep.id,mode=OUT,jdbcType=BIGINT}) </select>
注意statementType調用表示這是一個存儲過程,mode=IN表示這是輸入參數,mode=OUT表示這是輸出參數,調用成功之后,在service中獲取department的id和result字段,就能拿到相應的調用結果了。
看完上述內容,你們掌握怎樣使用MyBatis輕松實現遞歸查詢與存儲過程調用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。