zoukankan      html  css  js  c++  java
  • 使用ibatis时 sql中 in 的参数赋值

    一、问题描述:

    1.在使用ibatis执行下面的sql:

    update jc_jiesuan set doing_time = unix_timestamp(curdate()),doing_status = ?           where id in (?) and current_oprerate_type = ?

    2.传入的参数是:

    Parameters: [1, 444475305,444475300,444475297,444475299, 3]

    Types: [java.lang.Integer, java.lang.String, java.lang.Integer]

    3.报错信息为:

    org.springframework.dao.DataIntegrityViolationException: SqlMapClient operation; SQL [];  
    --- The error occurred in com/chl/dao/ibatis/sqlMap/sc_jiesuan-sqlmap.xml. 
    --- The error occurred while applying a parameter map. 
    --- Check the updateJiesuanDoingStatus-InlineParameterMap. 
    --- Check the statement (update failed). 
    --- Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '444475305,444475300,444475297,444475299'; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:  

    二、解决方法:

    1.使用“$”

    通常在ibatis中传入参数使用的是“#”,如#currentOprerateType:INTEGER#

    如果要想in中传入参数,则需要使用“$”符号。

    <update id="updateJiesuanDoingStatus" parameterClass="java.util.HashMap">
            update jc_jiesuan set doing_time = unix_timestamp(now()),doing_status = #doingStatus:INTEGER#
             where id in ($ids$)  and current_oprerate_type = #currentOprerateType:INTEGER#
    </update>

    但这种方式会增加系统被入侵的可能,因为'$'这个符号会将传进来的值直接组合成查询语句,这样很容易被Sql注入攻击。

    2.使用iterate属性。

    Iterate:这属性遍历整个集合,并为 List 集合中的元素重复元素体的内容。
    Iterate 的属性:
          prepend  - 可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
          property  - 类型为 java.util.List 的用于遍历的元素(必选)
          open  -  整个遍历内容体开始的字符串,用于定义括号(可选)
          close  -整个遍历内容体结束的字符串,用于定义括号(可选)
          conjunction -  每次遍历内容之间的字符串,用于定义 AND 或 OR(可选)

    示例一:

    <select id="selectByIterate" parameterClass="java.util.List" resultClass="user">

    SELECT * FROM USERS WHERE USER_ID IN

    <iterate conjunction="," open="(" close=")">

      #ids[]#

    </iterate>

    </select>

    示例二、

    <!-- 删除性别为man,年龄为 11,12 的Person记录,删除相应的person记录 -->
    <delete id="deletePerson" parameterClass="map">
    delete from 表名 where  sex=#sex# 
    <iterate prepend="and" property="personList" open="("
    close=")" conjunction="or">
    age=$personList[].age$
    </iterate>
    </delete>

    输出sql如下:
    delete from 表名 where sex='man' and (age =11 or age=12)

    参考资料:http://hongzhguan.iteye.com/blog/1222353

  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/sunzhenchao/p/2799365.html
Copyright © 2011-2022 走看看