ibatis中經常遇到乙個公用的sql被多處呼叫的情況。比如許可權驗證這塊,我需要知道每次使用者取出的資源驗證對其是否有許可權,則需要對取出的資源列表做乙個過濾。資源表結構大致如下
sys_res_row_id(資源id)
sys_sys_res_row_id(上級資源id)
system_row_id(資源所屬系統id)
is_enable(是否可用,即沒有被禁用)
sys_res_row_id(資源id)
sys_sys_res_row_id(上級資源id)
system_row_id(資源所屬系統id)
is_enable(是否可用,即沒有被禁用)
資源包括兩種概念:一種是系統,系統沒有上級資源,即sys_sys_res_row_id和system_row_id一定為空。一種是應用,系統下有應用,應用可包含子應用,所以應用一定所屬乙個系統,即sys_sys_res_row_id和system_row_id一定不為空。
使用者的型別又分為超級使用者(usertype=10),系統管理員(21),單位管理員(22),普通使用者(30)。超級使用者對所有的系統以及系統下的應用有訪問許可權。系管對管轄系統下的應用以及這個系統管理員所屬角色下的應用有權,單管對管轄單位的所屬系統及其應用以及這個管理員所屬角色下的應用有權,普通使用者對他所屬角色下的應用有權。角色下的應用是指乙個角色和應用列表進行繫結,如果使用者屬於此角色則有訪問其對應的應用的許可權。另外,對於系管,單管和普通使用者又新增了直接繫結應用的功能。
系統管理員用到的表:sys_manager_system 管理員和系統對應表 sys_resource資源表
單位管理員用到的表:sys_commanger_com 單位系統管理員對應表 sys_resource資源表
使用者用到的表(除超級使用者外三種使用者都用到):sys_rel_user_role 使用者角色關聯表 sys_rel_role_res角色資源關聯表 sys_role角色表 sys_resource資源表 sys_rel_user_resource使用者資源關聯表(此表是單獨操作的表,不隸屬與角色與應用繫結之中,是單獨控制使用者可訪問的應用)
在ibatis中寫成sql如下 寫道
select sys_res_row_id
from(
select t.sys_res_row_id
from sys_resource t
join sys_resource t1 on t.system_row_id =
t1.sys_res_row_id
where t1.is_enable = 1
union
select t6.sys_res_row_id
from sys_resource t6
where t6.sys_sys_res_row_id is null
and t6.is_enable = 1
select t1.sys_res_row_id
from sys_resource t1
where t1.is_enable = 1
start with sys_res_row_id in (
select t.sys_res_row_id
from sys_manager_system t
join sys_resource t1 on t1.sys_res_row_id=t.sys_res_row_id
where t1.is_enable=1 and sys_user_row_id = #userrowid#
select t2.sys_res_row_id
from sys_commanger_com t1
join sys_resource t2
on t1.sys_res_row_id = t2.sys_res_row_id
where t2.is_enable = 1
and t2.isgrantself = 0
and t1.sys_user_row_id = #userrowid# )
connect by prior sys_res_row_id = sys_sys_res_row_id
union
select t4.sys_res_row_id
from sys_rel_user_role t1
join sys_role t2
on t1.sys_role_row_id = t2.sys_role_row_id
join sys_rel_role_res t3
on t2.sys_role_row_id = t3.sys_role_row_id
join (select t.sys_res_row_id from sys_resource t join sys_resource t1 on t.system_row_id=t1.sys_res_row_id where t1.is_enable=1
union
select t6.sys_res_row_id
from sys_resource t6
where t6.sys_sys_res_row_id is null
and t6.is_enable = 1 ) t4
on t3.sys_res_row_id = t4.sys_res_row_id
where t2.is_enable = 1
and t1.sys_user_row_id = #userrowid#
union select t5.sys_res_row_id
from (select t.sys_res_row_id,t.is_enable from sys_resource t join sys_resource t1 on t.system_row_id=t1.sys_res_row_id where t1.is_enable=1
union
select t6.sys_res_row_id,t6.is_enable
from sys_resource t6
where t6.sys_sys_res_row_id is null
and t6.is_enable = 1 ) t5
join sys_rel_user_resource t2 on t5.sys_res_row_id=t2.sys_res_row_id
where t5.is_enable = 1 and t2.sys_user_row_id = #userrowid# )
思路如下:將列表分成三步union,如果是超級使用者(10)則直接取出所有的資源即可。如果是系統管理員(21)則先取出其管轄系統(管轄系統必須是可用,is_enable=1),用start with connect by語句取出其子應用,這是第一步;從其角色表中取出對應的資源,這是第二步;從使用者與資源繫結表中取出繫結的資源,這是第三步;然後這三步的資源列表的union就是系統管理員的可訪問應用。如果是單位管理員(22)則通過其管轄單位對應的系統找出對應的子應用,角色表取應用,使用者資源繫結表取應用,union;普通使用者(30)則從角色表和使用者資源繫結表取應用union;
其中的難點:
1.如果系統已經被禁用,則其下面的應用是不可用的。所以在第一步即通過系統來向下找應用可以直接通過is_enable在start with中判斷,但是在第二步第三步的時候有可能取到的不是系統而是其下的應用,這個應用的is_enable=1但是其所屬系統是禁用的,此時就需要加判斷,此時我通過其自連線來判斷,即 寫道
select t.sys_res_row_id,t.is_enable from sys_resource t join sys_resource t1 on t.system_row_id=t1.sys_res_row_id where t1.is_enable=1
2.對於join a on ??語句,如果a是乙個拼裝出的表, 不能在a中寫*,不認,應該寫清楚哪幾個字段。
3.對上面那段sql的引用,在ibatis中是用include語句完成 寫道
t1.sys_res_row_id in( )
iBatis高階應用
ibatis高階應用 2009 04 16 13 24 在ibatis的快速入門文章裡已經有了簡單例子,在這裡,只對高階應用說明!ibatis官方站點 小技巧 提示自動補全問題 在寫配置檔案的時候,我們希望檔案會帶有提示功能,所以在配置檔案上都會引用此檔案的定義dtd,例 dtd sql map c...
IBATIS中關於和 與 的應用
ibatis中關於iterate和 與 的應用 乙個包含list元素的hashmap引數賦給sqlmap public int getcountbyid string id,string title,list ids throws exception 上面的ids元素是乙個list,裡面包含了乙個i...
ibatis配置及應用
1 在spring啟動配置檔案中加ibatis對應bean classpath config xml common sqlmapconfig db2.xml classpath config xml biz sqlmapconfig db2.xml 2 設定sqlmapconfig 找到sqlmap...