`

ibatIS的<dynamic prepend="WHERE">原理,是判断前一个AND字母是否存在

阅读更多

今天付出了惨痛的代价,调sqlMap文件调了一下午,杯具啊!!!!!!!!!!!

 

1.首先看我错误的xml文件代码

	<select id="count"  parameterClass="com.hanpeng.base.phone.model.TCommission" 
											resultClass="java.lang.Integer">
		SELECT count(*) 
	  FROM  T_COMMISSION t1,t_product_type t2,T_BUSSINESS_SAFE t3  
	<dynamic prepend="WHERE">
		t3.type_num=t1.type_num  
	  	and t1.product_num=t2.product_num and t2.state='10'  
			<isNotEmpty prepend=" AND " property="otherFastCommission">
			t1.OTHER_FAST_COMMISSION =  #otherFastCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="otherNormCommission">
			t1.OTHER_NORM_COMMISSION =  #otherNormCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="money">
			t1.MONEY =  #money# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="fastPrice">
			t1.FAST_PRICE =  #fastPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="bussinessId">
			t3.bussiness_id =  #bussinessId# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="provinceCode">
			t2.province_code =  #provinceCode# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="areaCode">
			t2.area_code =  #areaCode# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="operators">
				t2.operators_code in
				<iterate property="operators" open="(" close=")" conjunction=",">  
					#operators[]#
				</iterate>
			</isNotEmpty>
		</dynamic>
	</select>

 ###注意:

t3.type_num=t1.type_num 
and t1.product_num=t2.product_num and t2.state='10'   我写到了<dynamic prepend="WHERE">的里面,因为要动态生成where子句,所以会根据前一个条件是否有AND,来判断下个条件是否给加AND符! 但注意我的 'and' 是小写的,如果用大写可能就好使了,t1.MONEY =  ?前面没给和AND,ibatIS自动拼接后的sql如下:

SELECT count(*) FROM  T_COMMISSION t1,t_product_type t2,T_BUSSINESS_SAFE t3 
WHERE t3.type_num=t1.type_num and t1.product_num=t2.product_num and t2.state='10' 
t1.MONEY =  ? 
AND t3.bussiness_id =  ?            
AND t2.area_code =  ?        
AND t2.operators_code in(?,?)

 所以,ibatIS的isNotEmpty标签是查找前一个sql有没有AND,没有,默认为where后第一个条件,不加AND。

有,默认不是where后的第一个条件,加AND。ibatIS写的时候应该是用"AND".equals(str)

 

二、正确应该的写法应该这样:

###注:只能这样修改,t3.type_num=t1.type_num 
and t1.product_num=t2.product_num and t2.state='10'   【
and改成AND不好使,已测试!!!

 

2.1  去掉<dynamic prepend="WHERE">标签(已验证,好使,唯一方法):

	<select id="count"  parameterClass="com.hanpeng.base.phone.model.TCommission" 
											resultClass="java.lang.Integer">
		SELECT count(*) 
	  FROM  T_COMMISSION t1,t_product_type t2,T_BUSSINESS_SAFE t3 
	  where 
	  	t3.type_num=t1.type_num  
	  	and t1.product_num=t2.product_num and t2.state='10'  
			<isNotEmpty prepend=" AND " property="productNum">
			t1.PRODUCT_NUM =  #productNum# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="typeNum">
			t1.TYPE_NUM =  #typeNum# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="fastCommission">
			t1.FAST_COMMISSION =  #fastCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="normCommission">
			t1.NORM_COMMISSION =  #normCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="createDate">
			t1.CREATE_DATE = #createDate# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="employeeId">
			t1.EMPLOYEE_ID =  #employeeId# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="alterDate">
			t1.ALTER_DATE = #alterDate# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="otherFastCommission">
			t1.OTHER_FAST_COMMISSION =  #otherFastCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="otherNormCommission">
			t1.OTHER_NORM_COMMISSION =  #otherNormCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="money">
			t1.MONEY =  #money# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="fastPrice">
			t1.FAST_PRICE =  #fastPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="normPrice">
			t1.NORM_PRICE =  #normPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="allFastCommission">
			t1.ALL_FAST_COMMISSION =  #allFastCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="allNormCommission">
			t1.ALL_NORM_COMMISSION =  #allNormCommission# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="otherFastPrice">
			t1.OTHER_FAST_PRICE =  #otherFastPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="otherNormPrice">
			t1.OTHER_NORM_PRICE =  #otherNormPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="allFastPrice">
			t1.ALL_FAST_PRICE =  #allFastPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="allNormPrice">
			t1.ALL_NORM_PRICE =  #allNormPrice# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="bussinessId">
			t3.bussiness_id =  #bussinessId# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="provinceCode">
			t2.province_code =  #provinceCode# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="areaCode">
			t2.area_code =  #areaCode# 		</isNotEmpty>
			<isNotEmpty prepend=" AND " property="operators">
				t2.operators_code in
				<iterate property="operators" open="(" close=")" conjunction=",">  
					#operators[]#
				</iterate>
			</isNotEmpty>
	</select>
 

 

 

分享到:
评论

相关推荐

    ibatis的dynamicSQL中,关于prepend的使用

    在探讨ibatis中的动态SQL(Dynamic SQL)及`prepend`的使用时,我们首先需要对ibatis有一个基本的理解。ibatis是一种开源的数据访问层框架,它简化了Java应用程序与数据库之间的交互过程。通过使用XML配置文件来定义...

    ibatis and和or联合查询 .doc

    - `&lt;isNotEmpty prepend="and" property="endtime"&gt;`: 当 `endtime` 不为空时,会生成 `AND starttime &lt;= #endtime#` 的SQL语句。 - `&lt;isNotEmpty prepend="and" property="rentcompany"&gt;`: 当 `rentcompany` 不为空...

    ibatis的动态查询

    - `&lt;isPropertyAvailable&gt;` 用于判断 Map 中是否存在某个键。 - 结合 `&lt;isNotNull&gt;`、`&lt;isLessThan&gt;` 等标签,可以根据 Map 中的数据动态生成 SQL 语句。 2. **示例代码**: ```xml &lt;select id=...

    ibatis_动态查询条件

    &lt;dynamic prepend="WHERE"&gt; &lt;isNotNull property="id"&gt; &lt;isGreaterThan prepend=" and " property="id" compareValue="0"&gt; id = #id# &lt;/isGreaterThan&gt; &lt;/isNotNull&gt; &lt;isNotEmpty prepend=" and " property=...

    ibatis16个常用sql语句

    where memberId = #memberId# and accessTimestamp &gt; #start# and accessTimestamp &lt;= #end# group by actionId &lt;/select&gt; ``` 上面的语句将查询`MemberAccessLog`表中满足条件的记录,并对结果进行分组和聚合。 ...

    ibatis dynamic 用法

    &lt;dynamic prepend="WHERE"&gt; &lt;isNotNull prepend="AND" property="firstName"&gt; (ACC_FIRST_NAME = #firstName# &lt;isNotNull prepend="OR" property="lastName"&gt; ACC_LAST_NAME = #lastName# &lt;/isNotNull&gt; ) &lt;/...

    Ibatis查询语句里,可以使用多表查询

    2. **条件过滤**:通过 `&lt;dynamic&gt;` 标签实现了动态 SQL,根据传入的参数决定是否添加 WHERE 子句。 3. **排序**:通过 `$page.sortFieldName$` 实现动态排序字段的选择,并且支持正序或倒序。 4. **分页**:使用 `...

    Ibatis高级使用讲解

    在这个例子中,`&lt;dynamic&gt;`标签用于创建一个可变的`WHERE`子句。`&lt;isNotEmpty&gt;`标签则用于检查用户对象的`name`和`address`属性是否为空。如果属性非空,就会在生成的SQL中添加对应的条件。`prepend="AND"`表示在...

    iBATIS动态标签

    1. `&lt;isEqual&gt;`:检查属性值是否等于静态值或另一个属性值。 2. `&lt;isNotEqual&gt;`:检查两者是否不相等。 3. `&lt;isGreaterThan&gt;`:检查属性值是否大于另一个值。 4. `&lt;isGreaterEqual&gt;`:检查是否大于或等于。 5. `...

    ibatis的错误总结

    &lt;isNotNull prepend="and"&gt; rf.role_id=#roleId# &lt;/isNotNull&gt; &lt;/dynamic&gt; &lt;/select&gt; ``` 这里的问题在于`parameterClass`被设定为`Long`,但实际传递的参数`roleId`的值是通过`#roleId#`引用的。然而,如果`...

    ibatis动态注入

    - `&lt;isGreaterEqual&gt;`:检查一个值是否大于等于另一个值。 - `&lt;isLessThan&gt;`:检查一个值是否小于另一个值。 - `&lt;isLessEqual&gt;`:检查一个值是否小于等于另一个值。 例如: ```xml &lt;isLessEqual prepend=”...

    API ibatis2

    &lt;dynamic prepend="AND"&gt; &lt;isNotEmpty prepend="AND" property="name"&gt; username LIKE '%$name$%' &lt;/isNotEmpty&gt; &lt;isNotEmpty prepend="AND" property="email"&gt; email LIKE '%$email$%' &lt;/isNotEmpty&gt; &lt;/...

    iBatis文档\ibatis.doc

    &lt;dynamic prepend="WHERE"&gt; &lt;isNotEmpty prepend="AND" property="name"&gt; name LIKE '%$name$%' &lt;/isNotEmpty&gt; &lt;isNotEmpty prepend="AND" property="age"&gt; age = #age# &lt;/isNotEmpty&gt; &lt;/dynamic&gt; &lt;/select&gt;...

    ibatis 动态代理dtd

    &lt;dynamic prepend="and" open="(" close=")"&gt; &lt;isNotNull property="ki.userId" prepend="and" removeFirstPrepend="false"&gt; USER_ID = #ki.userId# &lt;/isNotNull&gt; &lt;isNotNull property="kfi.initiator" prepend...

    IBATIS动态查询语句.doc

    在这个例子中,`&lt;dynamic&gt;`元素用于包裹整个动态部分,`prepend="WHERE"`表明在动态生成的SQL语句前会自动添加WHERE关键字。`&lt;isNotNull&gt;`和`&lt;isNotEmpty&gt;`则分别用于判断参数是否非空和字符串是否非空,进而决定...

    IBATIS SQL Maps 入门教程.pdf

    &lt;dynamic prepend="WHERE"&gt; &lt;isNotEmpty property="username"&gt; username = #{username} &lt;/isNotEmpty&gt; &lt;isNotEmpty prepend="AND" property="email"&gt; email = #{email} &lt;/isNotEmpty&gt; &lt;/dynamic&gt; &lt;/select&gt; ...

    Ibatis常用sql语句

    select moduleId, actionId from StatMemberAction &lt;dynamic prepend="where moduleId in"&gt; &lt;iterate open="(" close=")" conjunction="," &gt; #[]# &lt;/iterate&gt; &lt;/dynamic&gt; order by moduleId &lt;/select&gt; ``` 此查询...

    ibatis笔记

    - `&lt;dynamic prepend="where"&gt;`:用于构建动态SQL。 - `&lt;isNotNull property="aid"&gt;`:如果属性不为空,则执行以下操作。 - `&lt;isGreaterThan compareValue="0" property="aid" prepend="where"&gt;` - `aid = #aid#...

    struts2,spring整合及ibatis基础

    &lt;dynamic prepend="where"&gt; &lt;isNotEmpty property="empName" prepend="and"&gt; empName like('%$empName$%') &lt;/isNotEmpty&gt; &lt;isNotNull&gt; &lt;isNotEqual property="deptid" compareValue="0" prepend="and"&gt; ...

Global site tag (gtag.js) - Google Analytics