一、在ibatis的配置文件中,#,$等表示的意义是不同的。
举例来说明他们的应用:
DAO层代码赋值为:username=”abc” sortField=”ord1” ascending=”ASC”
<select id="getDestroyIdListLimit" parameterClass="java.util.Map" resultClass="String">
SELECT destroyId
FROM maildestroy
WHERE username = #username#
ORDER BY $sortField$ $ascending$
</select>
这样配置之后,最终在数据库执行的语句为:
SELECT destroyed FROM maildestroy WHERE username = 'abc ' ORDER BY ord1 ASC
通过上述比较之后,就不难看出:#符号的作用就是将传入的字符串参数前后自动加上’,传入的整形参数原封不动的放入到sql语句。
$符号的作用就是将传入的参数原封不动的放入到sql语句中。
这里特别强调一下,在进行排序的时候,一定要是使用$符号,而不是#符号。如果使用#符号之后,生成的sql语句就是:
SELECT destroyed FROM maildestroy WHERE username = 'abc ' ORDER BY 'ord1 ' 'ASC '
上述语句在执行的时候是不会报错的,但是此处的排序就会失效。因为这个问题造成的bug我刚刚就碰到过,相当隐蔽的bug,让我找得好苦。特此提醒大家注意。
二、Ibatis中like `%ibatis%`的写法实现模糊查询。假设需要传入参数name,那么在xml配置文件中对name进行模糊查询的写法有三种:
1、name like '%$name$%'
2、name like '%' || #name# || '%'
3、name like CONCAT('%', #name#, '%')
第一种方法就是运用了$符号的特殊意义来实现的,第二种方法中||则是xml配置文件中的字符串连接符,第三种方法中则是调用了mysql中的字符串连接函数来实现。
三、Ibatis中动态sql语句的配置,当我们不能确定传入的参数是否一定不为null或者空字符串“”,或者需要和特定的值进行比较的时候,我们就需要用到它的动态sql语句配置了。
<select id="getAllSign" parameterClass="sign" resultClass="sign">
SELECT * FROM sign
<dynamic prepend ="WHERE" >
<isNotEqual prepend="" property="isForce" compareValue="-1">
isForce=#isForce#
</isNotEqual>
</dynamic>
</select>
此处prepend表示:在动态语句之前,需要填写的字符串,此处是WHERE.
iBATIS动态查询几个常用属性
﹤ isPropertyAvailable ﹥ 属性是存在
﹤ isNotPropertyAvailable ﹥ 属性不存在
﹤ isNull ﹥ 属性值是null
﹤ isEmpty ﹥ 判断Collection.size ﹤ 1 或String.length()﹤1
﹤isEqual ﹥ 等于
﹤ isNotEqual ﹥ 不等于
﹤ isGreaterThan ﹥ 大于
﹤ isGreaterEqual ﹥ 大于等于
﹤ isLessThan ﹥ 小于
﹤ isLessEqual ﹥ 小于等于
在此处需要特别提出的是:传入的参数可以为自定义的对象,如这里的sign,也可以是java.util.Map,这两种情况在项目中都运用到了。