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。
分享到:
相关推荐
ibatis_3.0_Dynamic_Sql_设计解析(并与2.x的差异)
Ibatis_3__最简单的示例.pdf Ibatis_3__最简单的示例.pdf
使用 SQL Map,能够大大减少访问关系数据库的代码。 SQL Map 使用简单的 XML 配置文件将 Java Bean 映射成 SQL 语句,对比其他的数据库持续层和 ORM 框架(如 JDO 的实现, Hibernate 等), SQL Map 最大的优点在于...
iBATIS_DBL-2.2.0.638 iBatis src
ibatis,ibatis,ibatis,ibatis,ibatis
ibatis_struts2_spring_介绍
iBatis最全的动态SQL语句,你需要的都有,资源在于大家共享
08_ibatis教程_sql主键生成方式.zip 08_ibatis教程_sql主键生成方式.zip
iBATIS-SqlMaps2入门代码文档
开源om框架,实现数据的自动存储,简单易用,功能强大
iBATIS_API_DOC 帮助能手简单易用!
英文版ibatis教程,重点练习sqlmap,对初学者很有帮助。
08_ibatis教程_sql主键生成方式.rar
iBATIS_Database_Layer_开发指南
最新版本 IBatis.net+Castal_DLL 整合集合,测试通过可用,基于IBatis.net框架+Castal容器的框架DLL Castle.Core.dll 2.5.2 核心DLL Castle.Facilities.AutoTx.dll 2.5.1自动事务 Castle.Services.Transaction.dll ...
iBATIS-SqlMaps-2_cn中文文档
动态sql拼接
hibernate下载 : http://sourceforge.net/projects/hibernate/files/hibernate3/--3.XX版本 ...IBATS下载地址:...比如:ibatis-2.3.0.677.jar, spring 可在下载你需要的版本: http://www.springsource.org/download
自己整理的非常好用 好东西向大家分享 └ ^o^ ┘
08_传智播客ibatis教程_sql主键生成方式08_传智播客ibatis教程_sql主键生成方式