有个ibatis的xml,实在不知道如何解读,请大家帮忙看看

有个ibatis的xml,实在不知道如何解读,请大家帮忙看看

问题描述:

我刚接触ibatis,最近在项目里发现一个读取树节点的ibatis的xml,请问要怎么分析它到底像oracle数据库提交的是什么sql?


<!-- 根据角色列表获取指定机构ID的所有下级组织信息(树形结构) -->
<select id="getAllChildrenOrgs" parameterClass="java.util.HashMap" resultMap="orgMap">
<![CDATA[
SELECT * FROM (
SELECT * FROM
]]>
<isEmpty property="roleList">
(
SELECT DISTINCT ORG_ID,PARENT_ID,ORG_NO,DXP_CODE,ORG_NAME,BRIEFNAME,ORG_TYPE_SIGN,USED_STATE,
IS_DUMMYORG,ORG_LEVEL,SORT_NO,ADDRESS,REMARK,SETUP_DATE,CREATE_TIME,CREATOR,MODIFY_TIME,MODIFY_USER,
EXTEND_1,EXTEND_2,EXTEND_3,EXTEND_4,EXTEND_5,'1' HASRIGHT
FROM EIC_ORG
)
</isEmpty>
<isNotEmpty property="roleList">
(
SELECT T.*,decode(T1.ORG_ID,NULL,'0','1') HASRIGHT FROM
(
SELECT DISTINCT ORG_ID,PARENT_ID,ORG_NO,DXP_CODE,ORG_NAME,BRIEFNAME,ORG_TYPE_SIGN,USED_STATE,
IS_DUMMYORG,ORG_LEVEL,SORT_NO,ADDRESS,REMARK,SETUP_DATE,CREATE_TIME,CREATOR,MODIFY_TIME,MODIFY_USER,
EXTEND_1,EXTEND_2,EXTEND_3,EXTEND_4,EXTEND_5
FROM EIC_ORG
CONNECT BY PRIOR PARENT_ID = ORG_ID
START WITH ORG_ID IN (SELECT ORG_ID FROM EIC_RIGHT_ROLE_AREA_RANGE WHERE ROLE_ID IN
<iterate property="roleList" open="(" close=")" conjunction=",">
<![CDATA[
#roleList[].roleId#
]]>
</iterate>
)
UNION
SELECT DISTINCT ORG_ID,PARENT_ID,ORG_NO,DXP_CODE,ORG_NAME,BRIEFNAME,ORG_TYPE_SIGN,USED_STATE,
IS_DUMMYORG,ORG_LEVEL,SORT_NO,ADDRESS,REMARK,SETUP_DATE,CREATE_TIME,CREATOR,MODIFY_TIME,MODIFY_USER,
EXTEND_1,EXTEND_2,EXTEND_3,EXTEND_4,EXTEND_5
FROM EIC_ORG
CONNECT BY PRIOR ORG_ID = PARENT_ID
START WITH ORG_ID IN (SELECT ORG_ID FROM EIC_RIGHT_ROLE_AREA_RANGE WHERE ROLE_ID IN
<iterate property="roleList" open="(" close=")" conjunction=",">
<![CDATA[
#roleList[].roleId#
]]>
</iterate>
)
) T,
(
SELECT DISTINCT ORG_ID
FROM EIC_ORG
CONNECT BY PRIOR ORG_ID = PARENT_ID
START WITH ORG_ID IN (SELECT ORG_ID FROM EIC_RIGHT_ROLE_AREA_RANGE WHERE ROLE_ID IN
<iterate property="roleList" open="(" close=")" conjunction=",">
<![CDATA[
#roleList[].roleId#
]]>
</iterate>
)
) T1
WHERE T.ORG_ID = T1.ORG_ID(+)
)
</isNotEmpty>
<isEqual property="isUsed" compareValue="true">
WHERE USED_STATE = '1'
</isEqual>
<![CDATA[
)
CONNECT BY PRIOR ORG_ID = PARENT_ID
START WITH
]]>
<isEqual property="isSelf" compareValue="true">
ORG_ID = #orgId#
</isEqual>
<isNotEqual property="isSelf" compareValue="true">
PARENT_ID = #orgId#
</isNotEqual>
<![CDATA[
ORDER SIBLINGS BY SORT_NO
]]>
</select>

这和读程序一样的。

if(rolelist 为null)
select 语句

else

另外的select

.......

对了 你还得 理解
CONNECT BY PRIOR ORG_ID = PARENT_ID

START WITH

这是oralce的 SQl 语句语法 , 查询树形的 。

楼主太有才了,在sql里直接写业务逻辑,这种方式,小弟生平第一次见
如果是这样写,那还不如直接用存储过程来得快

sql里该写啥?

主要是去查查标签的用法:



比如iBATIS-SqlMaps-2_en.pdf里有相关介绍

ibatis会有很多自己的标签解析类,比如isEmpty 、isNotEqual 没遇到不同的标签就调用相应的处理类,类似于tomcat根据tld调用不同的标签处理类,道理应该是一样的呵呵

这不增加数据库服务器的负担么,难道业务太复杂,必须这么做?

看控制台日志不就好了

很好看懂,不过无法理解。