映射文件:
<select id="getProductDynamic2" resultMap="get-product-result" parameterClass="product"> <![CDATA[ select * from t_product ]]> <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="price"> prd_price=#price# </isNotNull> <isNotEmpty prepend="AND" property="description"> prd_description=#description# </isNotEmpty> </dynamic> </select>
注意:CDATA不应包括<dynamic>节点,否则标签不起作用!
DAO层:
public List getProductDynamic2(Product product) throws SQLException {
init();
List list = (List)sqlMapClient.queryForList("getProductDynamic2", product);
return list;
}
TEST类:
public void getProductDynamic2() throws SQLException {
Product product = new Product();
product.setPrice(206.99d);
product.setDescription("basketball");
List list1 = productDao.getProductDynamic2(product);
for(Iterator it=list1.iterator(); it.hasNext();) {
Product prd = (Product)it.next();
System.out.println(prd);
}
/**
* 注意:product2里的price(是double型,不是Double型)的值没有设置,所以默认为初始化时的值(0),而不是NULL,
传入到sqlmap映射文件时,被包装成Double类型(ibatis中传入参数的都是引用类型),值为0,
这对statement里的动态语句有影响!
*/
Product product2 = new Product();
product2.setDescription("basketball");
List list2 = productDao.getProductDynamic2(product2);
for(Iterator it=list1.iterator(); it.hasNext();) {
Product prd = (Product)it.next();
System.out.println(prd);
}
}
一元判定 是针对属性值本身的判定,如属性是否为NULL,是否为空值等。
<isEmpty>
检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。
二元判定 有两个判定参数,一是属性名,而是判定值,如
<isGreaterThan prepend="AND" property="age" compareValue="18"> (age=#age#) </isGreaterThan>