`
mmBlue
  • 浏览: 165200 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis中动态SQL_SELECT(代码复用)

阅读更多

SQL中最复杂的还是查询了,IBATIS的动态SELECT和<include/>配合起来的确很猛,

比如ORACLE中分页:

select * from (
       select rownum rn, t.* from (
		select * from myivr_trole    -- 真正的SQL语句
       ) t where rownum <= ?)
where rn > ?

其实上面SQL中真正自己写的只有 select * from myivr_trole 上面的,和下面的是固定的,那么ibatis中可以这么应用

我定义2个片段,一个为上部分SQL,一个为下部分的SQL,分别为sql_select_begin、sql_select_end

<sql id="sql_select_begin"> 
	select * from (
		select rownum rn,t.* from
	(
</sql> 
	 
<sql id="sql_select_end">
	 ) t
	 <isNotNull property="end">
		<isNotEmpty property="start" prepend="">
			<isNotEmpty property="end" prepend="where">
				<![CDATA[ rownum <= #end# ]]>
			</isNotEmpty>
		</isNotEmpty>
	 </isNotNull>
	)
	<isNotNull property="start">
		<isNotEmpty property="end" prepend="">
			<isNotEmpty property="start" prepend="where">
				<![CDATA[
					rn > #start#
				]]>
			 </isNotEmpty>
		</isNotEmpty>
	</isNotNull>
</sql>

并且我将它们放入namespace="common"中,那么我现在写真正的逻辑SQL

<sql id="sql_role_where">
	select * from myivr_trole
	<dynamic prepend="where">
		<isNotEmpty property="id" prepend="and">
			roleId = #id#
		</isNotEmpty>
		<isNotEmpty property="statu" prepend="and">
			statu = #statu#
		</isNotEmpty>
		<isNotEmpty property="name" prepend="and">
			upper(ROLENAME) like upper('%'||#name#||'%') ESCAPE '/'
		</isNotEmpty>
		<isNotEmpty property="desp" prepend="and">
			upper(ROLEDESP) like upper('%'||#desp#||'%')
		</isNotEmpty>
		<isNotEmpty property="startTime" prepend="and">
			<![CDATA[ 
				logTime >= #startTime#
			]]>
		</isNotEmpty>
		<isNotEmpty property="endTime" prepend="and">
			<![CDATA[ 
				logTime <= #endTime#
			]]>
		</isNotEmpty>						
	</dynamic>
</sql>

最后一步,我将之前的2个片段组合:

<select id="queryRoleForList" resultMap="role.roleMap" parameterMap="role.paramRoleMap">
	<include refid="common.sql_select_begin"/>
	<include refid="role.sql_role_where"/>
	<include refid="common.sql_select_end"/>
</select>

那么,现在查所以数据的话会生成SQL:

select * from (
       select rownum rn,t.* from (
		select * from myivr_trole
	) t
) 

如果是分页的话,会生成:

select * from (
       select rownum rn, t.* from (
            select roleid, rolename, roledesp, logtime, statu
	    from myivr_trole
	    where upper(rolename) like upper('%' || ? || '%') escape '/'
	    and upper(roledesp) like upper('%' || ? || '%') 
	) t where rownum <= ?
) where rn > ?

 

现在你应该还可以想到其实select count(*)这个也是重复的,也可以写成一个片段的

<sql id="sql_count">
	select count(*) from
</sql>

再查询总记录的时候就可以这样了:

<select id="queryCountForRole" resultClass="long" parameterMap="role.paramRoleMap">
	<include refid="common.sql_count"/>(
	<include refid="role.sql_role_where"/>)
</select>

看到没,WHERE条件重复使用了,呵呵,下一篇讲解如何优化SQL。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics