Ibatis中#和$两个符号的使用区别

本文介绍了Ibatis中动态SQL的使用方法,包括#与$符号的区别及应用场景,尤其是在复杂查询与迭代场景中的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: http://www.mysjtu.com/page/M0/S542/542113.html
一般在Ibatis的动态SQL部分,使用例如#id#,$id$这样的格式,
1、在复杂动态SQL语句中,类似#field#,如果field变量值为id,则Ibatis会将#field#转换为‘id’;
     例如:<statement id ="getProduct" resultMap="get-product-result">
                   SELECT * FROM PRODUCT
                   <dynamic prepend="WHERE">
                         <isNotEmpty property="description">
                               PRD_DESCRIPTION $operator$  #description#
                         </isNotEmpty>
                   </dynamic>
                 </statement>
        上面的例子中,参数对象的operator属性将用于替换符号$operator$,假设operator属性等于“like”,description属性等于“%dog%”,生成的SQL语句如下,
SELECT * FROM PRODUCT WHERE PRD_DESCRIPTION  LIKE "%dog%"
在复杂动态SQL语句中(即语句中有<dynamic >,<isNotEmpty>等标签,<iterate>标签除外),##中的变量解析之后会被""括起来,作为一个String;
$$中的变量会直接解析;2、在包含iterate的动态语句中,必须使用##,但是不会作为String来处理,而是直接解析变量,例如:
     <update id="updateCDNSRVFileStatus" >
         update #tableName# set STATUS = #status#   
              <isPropertyAvailable prepend="WHERE" property="videoFileIds" >
                        FILE_ID  IN
                      <iterate property="videoFileIds" open="(" close=")" conjunction=",">
                           #videoFileIds[]#
                      </iterate>
             </isPropertyAvailable> 
      </update>


 

 


 

 


 

ibatis中的order by 参数配置问题


 


今天在写项目的时候,碰到了这个问题,调试了半天都没搞定。最后把问题锁定到xml配置文件上:


一般配置文件都这么写


<select ...>


 select * from table where XXX = #valule# order by #value#


</select>


但是由于ibatis在将参数值映射到statement里面时,所以对于 #value# 会解释成 字符串 "value" ,于是我的代码就被解释成


select * from table where XXX = "valule" order by "value"


这样显然不对,所以得换个方法


<select ...>select * from table where XXX = #valule# order by $value$</select>


用$$来包含order by的参数,就OK了~因为$$内的value不会被解释成"value",而是直接原样翻译。



总结:如果要考虑数据类型,用#;若是只考虑字符,则用$.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值