美文网首页
iBATIS使用$和#的一些理解

iBATIS使用$和#的一些理解

作者: MinoyJet | 来源:发表于2019-04-01 14:30 被阅读0次

    我们在使用iBATIS时会经常用到#这个符号。

    比如:

    select * from member where id =#id# 
    

    然后,我们会在程序中给id这个变量传递一个值,iBATIS会自动将 #id# 转成我们传递的内容。

    但是我最近碰到一个奇怪的问题。我在批量删除或修改的时候,居然SQL失效了。

    SQL如下:

    update user set flag=#flag# where id in (#id#)     
    
    delete from user where id in (#id#)   
    

    传递的id为1,2,3。但是数据却没有任何的修改。

    后来查找了半天,原来原因就是这个 # 的问题。因为iBATIS默认会把 “#” 中间的变量作为字符串来处理。这样,就会出现这样的SQL:

    update user set flag='1' where id in ('1,2,3')     
    
    delete from user where id in ('1,2,3')  
    

    这样的SQL数据库当然是不会执行的。那我们只有绕开iBATIS了吗?

    其实不用,iBATIS其实还提供了另外一种方式,那就是使用 $ 来传递值。你使用 $ 将你的变量括起来,iBATIS不会给这个变量做任何的处理,直接生成你要的SQL

    如下面代码从后台传入的参数为String="1,2,3,4";但是通过$value$获取到的是1,2,3,4:

    <delete id="deleteEntities" parameterType="java.lang.String"> 
        DELETE FROM INFO_TERMINALPRIVILEGES WHERE ID in ($value$) 
    </delete>
    
    update user set flag=$flag$ where id in ($id$)     
    --update user set flag=1  where id in (1,2,3)     
    
    delete from user where id in ($id$)  
    --delete from user where id in (1,2,3) 
    

    还可以用ibatis的iterate解决:

    SQL:

    <select id="test" parameterClass="java.util.List" resultClass="test.Roadline">      
      select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in       
        <iterate open="(" close=")" conjunction=",">      
          #value[]#      
        </iterate>      
    </select>   
    
    List list = new ArrayList();      
    list.add("aaa");      
    list.add("bbb");      
    List rsList = sqlMap.queryForList("roadline.test", list);    
    

    生成的SQL:

    select * from SYS_ROAD_LINE_INFO where ROAD_LINE_NO in (?,?)   
    

    $ 中间的变量就是直接替换成值的
    # 会根据变量的类型来进行替换

    原文可见:iBATIS使用$和#的一些理解

    相关文章

      网友评论

          本文标题:iBATIS使用$和#的一些理解

          本文链接:https://www.haomeiwen.com/subject/vkafbqtx.html