映射文件:
- <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>