日期:2014-05-20  浏览次数:20777 次

IBATIS里怎样根据传入参数拼接where子句
用IBATIS做一个多关键词查询的功能,
用户可以输入任意多个关键词,比如K1,K2,K3...
也可以是一个。


那么在写WHERE子句的时候应该根据关键词的数量写,
如下:
where text like '%'||#K1#||'%' and text like '%'||#K2#||'%' and text like '%'||#K3#||'%' .....


因为关键词的数量并不是固定的。
所以IBATIS里需要拼接这个WHERE子句,那么该如何写呢?

------解决方案--------------------
定义一个和Form一样的对象类
.XML如下:
SELECT。。。。
<dynamic prepend="WHERE"> 
<isNotEmpty prepend="AND" property="name"> 
NAME like #name# 
</isNotEmpty>
<isNotEmpty prepend="AND" property="phone"> 
FILE_NAME like #file_name# 
</isNotEmpty>
.....
......有多少+多少,动态的
</dynamic>
------解决方案--------------------
一元判定
一元判定是针对属性值本身的判定,如属性是否为NULL,是否为空值等。
上面示例中isNotEmpty就是典型的一元判定。
一元判定节点有:
节点名描述
<isPropertyAvailable> 参数类中是否提供了此属性
<isNotPropertyAvailable> 与<isPropertyAvailable>相反
<isNull> 属性值是否为NULL
<isNotNull> 与<isNull>相反
<isEmpty> 如果属性为Collection或者String,其size是否<1,
如果非以上两种类型,则通过
String.valueOf(属性值)
获得其String类型的值后,判断其size是否<1
<isNotEmpty> 与<isEmpty>相反

二元判定
二元判定有两个判定参数,一是属性名,而是判定值,如
<isGreaterThan prepend="AND" property="age"
compareValue="18">
(age=#age#)
</isGreaterThan>
其中,property="age"指定了属性名”age”,compareValue=”18”指明
了判定值为”18”。
上面判定节点isGreaterThan 对应的语义是:如果age 属性大于
18(compareValue),则在SQL中加入(age=#age#)条件。
二元判定节点有:
节点名属性值与compareValues的关系
<isEqual> 相等。
<isNotEqual> 不等。
<isGreaterThan> 大于
<isGreaterEqual> 大于等于
<isLessThan> 小于
<isLessEqual> 小于等于


------解决方案--------------------
用动态SQL.

LZ可以试试iBator自动生成的SQLMAP
------解决方案--------------------
ibatis 有动态生成 sql的功能,就像楼2楼提供思路一样
------解决方案--------------------
错误提示显示你的""转化成数字的时候发生错误,
这是类型转化错误,你的两种方式都是正确的,所以请检查file_data和keywords的类型是否正确




------解决方案--------------------
建议LZ检查下sqlmap,比如字段名是否对应,类型是否对应。。。
------解决方案--------------------
For input string: ""
是不是List中有空字符串,在调用SQL之前断点看下List里的每一个字符串是不是都有值,并且能转换成数值型!
------解决方案--------------------
我晕死

<![CDATA[ ]]>
说明里面的东西不是xml,
解析器也就不把它解析成xml的内容了。
<>这样的东西都会把它当成sql的一部分,而不是ibatis的配置

我晕死过去一会

good luck