Ibatis 动态条件SQL语句

在开发ibatis项目的时候 由于要写sql语句但是 实体xml中又无法通过参数拼接sql语句,导致同一张表不同条件的查询 删除等操作要写不同的sql语句会很麻烦。花了点时间找资料跟实践,发现ibatis也能实现对动态的对条件语句的拼接:

<!-- 动态条件查询语句组合开始 -->
	<sql id="sql_delete">
		delete
	</sql>
	<sql id="sql_count">
		select count(*)
	</sql>
	<sql id="sql_select">
		select *
	</sql>
	<sql id="sql_where">
		from DeviceInfo
		<dynamic prepend="where">
			<!-- 不为空就执行 如果传过来的参数中不带有id这个参数那么将不会执行此条,会往下执行-->             
			<isNotEmpty prepend="and" property="id">	
				id = #id#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="deviceId">
				deviceId = #deviceId#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="displayModeId">
				displayModeId = #displayModeId#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="statuId">
				statuId = #statuId#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="manageId">
				manageId = #manageId#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="projectId">
				projectId = #projectId#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="creater">
				creater = #creater#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="createTime">
				createTime = #createTime#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="updater">
				updater = #updater#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="updateTime">
				updateTime = #updateTime#
			</isNotEmpty>
		</dynamic>
	</sql>
	<!-- end -->
	
	
	<select id="selectDeviceByWhere" resultClass="DeviceInfo" parameterClass="Map">
		<!-- 拼接SQL语句 最后组合SQL语句-->
		<include refid="sql_select"/>
		<include refid="sql_where"/>
	</select>
	
	<delete id="deleteByWhere" parameterClass="Map">
		<include refid="sql_delete"/>
		<include refid="sql_where"/>
	</delete>

上面的代码中如果parameterClass传递过来的Map参数中,没有某一项条件所需要的参数那么久会生成不同的SQL语句

如:

public void deleteById(int id) { if (id != 0) { map.put("id", id); getSqlMapClientTemplate().delete("deleteByWhere", map); } else { System.out.println("delete error"); } }
上述代码中Map中的key只有id那么 生成的sql语句为:

delete from DeviceInfo where id = (Map中的value)


其他属性:

1、二元条件元素的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择 compareValue)
compareValue - 用于比较的值(必选或选择 compareProperty)
<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。


2、一元条件元素的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
<isPropertyAvailable> 检查是否存在该属性(存在 parameter bean 的属性) 。
<isNotPropertyAvailable> 检查是否不存在该属性(不存在 parameter bean 的属性) 。
<isNull> 检查属性是否为 null。
<isNotNull> 检查属性是否不为 null。
<isEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否为 null或空( “”或size() < 1) 。
<isNotEmpty> 检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
是否不为 null 或不为空( “”或 size() > 0)。


3、Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容。

Iterate 的属性:
prepend - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
property - 类型为 java.util.List 的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)

<iterate> 遍历类型为 java.util.List的元素。



你可能感兴趣的:(sql,xml,ibatis,delete)