动态查询
ibatis提供了丰富的判定节点,它主要分为一元判定和二元判定两类
一元判定是针对属性值本身的判定,如属性是否为NULL,是否为空值等
以下是比较典型的一元判定
判定节点 | 描述 |
---|---|
<isPropertyAvailable> | 参数类中是否提供了此属性 |
<isNotPropertyAvailable> | 与<isPropertyAvailable>相反 |
<isNull> | 属性值是否为NULL |
<isNotNull> | 与<isNull>相反 |
<isNotEmpty> | 与<isEmpty>相反 |
<isEmpty> | 若属性为Collection或者String,其size是否小于壹相反 其它类型则通过String.valueOf(属性值)获得其String类型的值后,判断其size是否小于壹 |
下面是其它常见的二元判定节点
判定节点 | 描述 |
---|---|
<isEqual> | 相等 |
<isNotEqual> | 不等 |
<isGreaterThan> | 大于 |
<isGreaterEqual> | 大于等于 |
<isLessThan> | 小于 |
<isLessEqual> | 小于等于 |
下面是动态查询的配置示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="user" type="com.xuanyuv.model.User"/>
<select id="findByNameOrSex" parameterClass="user" resultClass="user">
select * from t_user
<dynamic prepend="WHERE">
<!--
prepend属性,指明了本节点中定义的SQL子句在主体SQL中出现时的前缀
而name属性对应的isNotEmpty节点,ibatis会自动判定是否需要追加prepend前缀
这里"name = #name#"是WHERE子句中的第一个条件子句,不需要AND前缀,会自动省略
并且:实际运行期将生成带占位符的PreparedStatement
-->
<isNotEmpty prepend="AND" property="name">
name = #name#
</isNotEmpty>
<isNotEmpty prepend="AND" property="sex">
sex = #sex#
</isNotEmpty>
</dynamic>
</select>
<select id="findByAddressUseName" parameterClass="user" resultClass="user">
select * from t_user
<dynamic prepend="WHERE">
<!-- 判定节点的定义可以非常灵活,甚至可以使用嵌套的判定节点来实现复杂的动态映射 -->
<isNotEmpty prepend="AND" property="name">
(name = #name#
<isNotEmpty prepend="AND" property="address">
address = #address#
</isNotEmpty>
)
</isNotEmpty>
</dynamic>
</select>
<select id="findByAge" parameterClass="int" resultClass="user">
select * from t_user
<dynamic prepend="WHERE">
<!-- 这是一个二元判定。二元判定有两个判定参数,一是属性名,一是判定值 -->
<isGreaterThan prepend="AND" property="age" compareValue="22">
age = #age#
</isGreaterThan>
</dynamic>
</select>
</sqlMap>
缓存机制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="user" type="com.xuanyuv.model.User"/>
<!--
cacheModel节点:定义了本映射文件中使用的Cache机制
这里申明了一个名为"user-cache"的cacheModel,之后可以在<statement>中对其引用
与Hibernate类似,ibatis通过缓冲接口的插件式实现,提供了多种Cache的实现机制可供选择
目前有四种Cache实现:MEMORY、LRU、FIFO、OSCACHE
-->
<cacheModel type="LRU" id="user-cache">
<!-- Cache刷新间隔。间隔时间到了之后,会在下一次查询时,越过Cache直接查数据库,然后才更新Cache -->
<flushInterval hours="24"/>
<!--
当这些statement被执行了,那么下次的查询将会通过SQL去查,同时用查询结果更新Cache
注意和flushInterval一样,都不是主动刷新,而是由下次查询来触发被动刷新
在一个cacheModel中可以指定多个flushOnExecute
-->
<flushOnExecute statement="updateUser"/>
<!-- 本CacheModel中最大容纳的数据对象数量 -->
<property name="size" value="1000"/>
</cacheModel>
<select id="findById" parameterClass="int" resultClass="user" cacheModel="user-cache">
<![CDATA[
select * from T_USER where id = #id#
]]>
</select>
<update id="updateUser" parameterClass="user">
update T_USER set name=#name#, birth=#birth# where id=#id#
</update>
</sqlMap>