ibatis 之 动态SQL查询(dynamic )

映射文件:

 

<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>

 

 

 

 

你可能感兴趣的:(DAO,sql,ibatis)