1. 程式人生 > >使用MyBatis輕鬆實現遞迴查詢與儲存過程呼叫

使用MyBatis輕鬆實現遞迴查詢與儲存過程呼叫

vhr部門管理模組更新啦!為了讓小夥伴們快速理解部門管理模組實現思路,我想通過3篇短文來給大家介紹下大致的實現思路和核心程式碼。

建議小夥伴們先閱讀前面的文章,會有助於你理解本文。

本文主要介紹部門管理功能的後臺程式,其實都是常規程式碼,我們重點關注兩點:1.遞迴呼叫,2.儲存過程呼叫

遞迴呼叫

由於部門的層級不可控,因此如果我想要獲取所有部門的完整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輕鬆實現查詢儲存過程呼叫

vhr部門管理模組更新啦!為了讓小夥伴們快速理解部門管理模組實現思路,我想通過3篇短文來給大家介紹下大致的實現思路和核心程式碼。 建議小夥伴們先閱讀前面的文章,會有助於你理解本文。 本文主要介紹部門管理功能的後臺程式,其實都是常規程式碼,

Oracle sql,mybatis查詢儲存過程呼叫

Oralce 遞迴sql    一、查詢所有子節點 SELECT * FROM district ST

mybatis 實現查詢出樹結構節點

mybatis 實現遞迴查詢出樹結構節點 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.

mysql儲存過程實現查詢

-- 建表create table _organization(    orgcode varchar(40) not null primary key comment '機構編號',    parentcode varchar(40) comment '父機構編號',   

mysql8.0CTE實現查詢

+----+----------+--------------+| ID | ParentID | name         |+----+----------+--------------+|  1 | &n

DNS查詢迭代查詢

DNS遞迴查詢與迭代查詢 summary 一直以來對於DNS查詢的“遞迴”與“迭代”方式感到困惑。一般人就直接跟你說“DNS客戶端向DNS伺服器請求叫遞迴查詢”,“DNS伺服器之間的查詢請求是迭代查詢”,聽了之後根本不知所謂。。。直到我看了《網路作業系統——windows se

MySQL實現查詢樹形結構

這兩天,遇到了子節點的需求.這裡簡單做個總結. 1.資料庫中的樹形結構 資料庫中存貯的資料,以ID和P_ID(父id),來存貯樹形結構 這樣如果需要查詢某個節點的子節點,就可以尋找P_ID.如果要查詢所有子節點,就需要遍歷所有的子節點的子節點. 如果要判斷是否為同級的節點,就可以查詢

oracle 查詢排序

有時候where查詢出的資料沒有層級關係,想要查詢的不光是是當前層的資料還要包括當前層以及當前層級以下的所有資料 SELECT * FROM pb_join ja INNER JOIN (SELECT org_id, state FROM

oracle中用start with...connect by prior子句實現查詢[例子不錯]

  今天在做許可權這一塊,碰到要讀取oracle中的樹形結構,所以就用到了start with...connect by prior。所以留個腳印以後碰到可以看看。   在oracle中的select語句可以用start with...connect by prior

Sql(用with 實現查詢

1.遞迴原理(摘自網上)    遞迴CTE最少包含兩個查詢(也被稱為成員)。第一個查詢為定點成員,定點成員只是一個返回有效表的查詢,用於遞迴的基礎或定位點。第二個查詢被稱為遞迴成員,使該查詢稱為遞迴成

DB2通過SQL實現查詢 (根據子機構查詢機構所屬樹)

create table  MAIN_NODE ( MLA_ID               INTEGER     not null,   MLA_ROOTID          INTEGER,                     MLA_PARENTID    

一個jdbc儲存過程呼叫之間的資料對映問題

背景 一個功能,管理員直接新增使用者賬號,儲存過程如下【postgresql資料庫】: -- 儲存過程 管理員直接新增會員賬號 CREATE OR REPLACE FUNCTION "sp_account_member_reg_by_admin"( para_nam

PLSql -- 查詢的另幾種實現方式(函式/儲存過程

問題 這是一個樹結構,查詢教師“胡明星”的所有主管及姓名:(無主管的教師也需要顯示),顯示(教師編號、教師名稱、主管編號、主管名稱) 解決1 declare v_tno hand_t

oracle之樹狀結構的儲存展示(查詢

(一)遞迴 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法。 菲波那切數列就是利用遞迴定義的: ·F0 = 0·F1 = 1 ·Fn = Fn – 1 + Fn – 2 (二)遞迴查詢

二分查詢演算法java版實現(實現實現)

二分查詢,如果一個有序集合,需要查詢其他特定 的查詢,我們可以使用二分查詢,加快查詢速度,具體的思路就是,每次取有序陣列的中間元素與待查詢元素進行比較,從而縮小一半的查詢範圍。 java版本非遞迴方式

用mysql儲存過程代替查詢 用mysql儲存過程代替查詢

用mysql儲存過程代替遞迴查詢 查詢此表某個id=4028ab535e370cd7015e37835f52014b(公司1)下的所有資料 正常情況下,我們採用遞迴演算法查詢,如下 1

函式二分查詢演算法

一、遞迴函式 1.遞迴呼叫的定義 遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫 def foo(n): print(n) n += 1 foo(n) foo(1) 2.遞迴最大深度 最大遞迴深度預設是

看動畫輕鬆理解「「動態規劃」

在學習「資料結構和演算法」的過程中,因為人習慣了平鋪直敘的思維方式,所以「遞迴」與「動態規劃」這種帶迴圈概念(繞來繞去)的往往是相對比較難以理解的兩個抽象知識點。 程式設計師小吳打算使用動畫的形式來幫助理解「遞迴」,然後通過「遞迴」的概念延伸至理解「動態規劃」演算法思想。 什麼是遞迴 先下定義:遞迴演算

java實現版二分查詢演算法

遞迴的特點? 1.玩遞迴主要就是去嘗試解決一下規模更小的問題,採用遞迴將問題收斂到最簡單的情況解決。 2.由1可知,遞迴肯定是有一個最簡單的情況。 3.遞迴呼叫的父問題和準備解決的子問題之間不應該有交

看動畫輕鬆理解““動態規劃”

作者 | 程式設計師小吳 來源 | 五分鐘學演算法 在學習「資料結構和演算法」的過程中,因為人習慣了平鋪直敘的思維方式,所以「遞迴」與「動態規劃」這種帶迴圈概念(繞來繞去)的往往是相對比較難以理解的兩個抽象知識點。 程式設計師小吳打算使用動畫的形式來幫助理解「遞迴」,