`
mmBlue
  • 浏览: 167286 次
  • 性别: 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。

分享到:
评论

相关推荐

    ibatis1.rar_ibatis

    Ibatis的另一个强大特性是SQL动态标签,它允许我们在XML映射文件中编写动态SQL。例如,可以根据条件动态地添加WHERE子句,极大地提高了代码的可复用性和灵活性。 7. **Ibatis的优势** Ibatis的优势在于它的灵活性...

    iBATIS-SqlMaps-2_cn.pdf

    6. **Dynamic SQL**:允许在XML映射文件中进行条件判断,动态生成SQL语句,提高了SQL的灵活性和复用性。 7. **Transactions**:SQL Maps支持声明式和编程式的事务管理,确保数据的一致性和完整性。 通过使用iBATIS...

    iBATIS-SqlMaps-2_ja.pdf

    - **SQL 片段重用**:通过 `&lt;sql&gt;` 元素定义通用的 SQL 片段,提高代码复用性。 - **键值自动生成**:配置主键自增或其他机制来自动为新记录生成唯一的标识符。 - **存储过程**:支持调用数据库中的存储过程,并处理...

    ibatis常用sql语句

    标题与描述概述的知识点主要集中在iBATIS框架的SQL映射技术上,特别是针对不同类型的输入参数如何在iBATIS中构建SQL语句。以下是对这些知识点的详细展开: ### iBATIS SQL映射技术概览 iBATIS是早期流行的Java持久...

    Ibatis-api.rar_ibatis_ibatis api

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得开发者能够将注意力集中在编写可复用的Java代码上,而不是处理繁琐的JDBC代码和手动参数设置。Ibatis API是这个框架的核心,提供了丰富...

    iBATIS-SqlMaps-2 PDF文档资料(日文)

    例如,支持动态SQL,允许在运行时根据条件构建SQL语句,极大地提高了代码的复用性和灵活性。此外,还包括事务管理,使得开发者能够更好地控制数据的读写操作,并且支持多种数据库,如Oracle、MySQL、SQL Server等。 ...

    iBatis 入门例子 (含源代码)

    8. **动态SQL**:iBatis允许你在SQL映射文件中编写条件语句,根据参数值动态地改变SQL结构,极大地提高了SQL的可复用性和灵活性。 通过这个入门例子,你可以亲手实践上述知识点,逐步理解iBatis的工作原理,并学会...

    ibatis拼接字符串

    在本篇文章中,我们将深入探讨如何使用 Java 编程语言结合 iBatis 框架进行 SQL 字符串的动态拼接。通过分析提供的代码片段,我们可以了解到在实际开发过程中,这种动态 SQL 的构建方式非常常见,尤其是在处理复杂的...

    ibatis官方中文文档

    通过使用动态SQL,可以实现SQL语句的条件化,提高代码复用性。 4. **参数映射**: `#{}` 语法用于参数绑定,它可以防止SQL注入。在SQL语句中,#{paramName}会被替换为预编译语句的占位符,参数值则在执行时传入。 ...

    IBATIS SQL Maps开发指北

    IBATIS的动态SQL功能允许在运行时根据条件动态构建SQL语句,提高了SQL的灵活性和复用性。例如,`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`等标签可以用来构建条件语句。 **4. 分页查询** 在...

    ibatis动态注入

    为了提高代码复用性,iBATIS还支持将动态SQL片段定义为独立的`&lt;sql&gt;`标签,如: ```xml &lt;sql id="queryCondition"&gt; where user_id = #{userId} &lt;/sql&gt; &lt;select id="getUserList" resultMap="user"&gt; ...

    iBatis文档

    SQL映射文件中的&lt;sql&gt;标签可以复用SQL片段,&lt;select&gt;、、、标签分别对应查询、插入、更新和删除操作。动态SQL是iBatis的一大亮点,通过、、、等标签,可以在运行时根据条件动态生成SQL语句。 此外,iBatis支持预...

    Ibatis驱动

    Ibatis支持动态SQL,这使得开发者能够在SQL映射文件中根据条件动态构建SQL语句,极大地提高了代码的复用性和灵活性。此外,Ibatis还提供了事务管理,可以控制事务的边界,确保数据的一致性。 总的来说,Ibatis驱动...

    iBATIS_In_Action:使用映射语句(一).doc

    iBATIS是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML文件中,通过映射语句与Java对象进行交互,从而实现数据的存取。本章将介绍如何创建和使用映射语句,以及如何处理查询结果。 4.1 使用基础 ...

    ibatis2.3.4 jar包

    动态SQL是Ibatis的一大亮点,它允许在XML映射文件中编写条件语句,使得SQL能够根据Java对象的状态动态生成。例如,以下示例展示了如何根据用户ID来选择性地加载用户信息: ```xml &lt;select id="getUser" ...

    ibatis官方资料

    通过&lt;sql&gt;元素可以复用SQL片段,&lt;select&gt;、、和元素分别对应SQL查询、插入、更新和删除操作。 4. **动态SQL**:iBATIS支持条件式SQL,可以通过if、where、choose(when/otherwise)、trim、foreach等元素构建动态...

    Ibatis 入门经典 实例

    Ibatis 的一大亮点是支持动态 SQL,可以使用 `&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;` 等标签根据条件动态构建 SQL 语句,提高代码复用性。 五、参数映射与结果映射 1. 参数映射:通过 `...

    Ibatis 2.3.4 数据库无关分页

    Ibatis 是一款轻量级的Java持久层框架,它提供了SQL映射功能,使得开发者能够将SQL语句与Java代码分离,从而实现更灵活的数据访问。在2.3.4这个版本中,Ibatis 提供了数据库无关的分页功能,这是一种在不依赖特定...

    ibatis +mysql 实例

    2. **动态SQL**:Ibatis支持动态SQL,可以根据业务逻辑的不同条件,动态构建执行的SQL语句,提高了代码的复用性和灵活性。 3. **分离业务逻辑与数据访问**:Ibatis允许将SQL语句和业务逻辑分离,有利于代码的组织和...

Global site tag (gtag.js) - Google Analytics