在开发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的元素。