使用ibatis时 sql中 in 的参数赋值(转)

转:http://www.cnblogs.com/sunzhenchao/archive/2012/12/03/2799365.html

一、问题描述:

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

时间: 2024-11-05 15:54:48

使用ibatis时 sql中 in 的参数赋值(转)的相关文章

sql中like带参数的写法

最近学习过程中,用到like语句,但为了防止sql注入,所以得使用sql参数化的方法进行查询.发现使用like语句时,不同于直接的查询.尝试了几次,都没有成功. 直接查询时的写法为: select 字段 from 表 where 字段=@parameter; SqlParameter s1 = new SqlParameter("@parameter",parameter); 而在like语句中为: string sql = "select 字段 from 表 where 字

在PL/SQL中使用带参数的游标

需求:查询并输出部门名称为SALES的员工信息 1 SET serveroutput ON; 2 DECLARE 3 CURSOR c_emp(paramName VARCHAR2) IS 4 SELECT * FROM emp WHERE deptno = (select deptno from dept where dname = paramName); 5 BEGIN 6 FOR e IN c_emp('SALES')loop 7 dbms_output.put_line(e.empno|

sql 中set和select区别

基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ? 综合 ? 共 912字 ? 字号 小 中 大 ? 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果.那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢?经过网上的查询,及个人练习,总结两者有以下几点主要区别:假定有设定变量: 复制代码 代码如下: DECLARE @VAR1 VARCHAR(1) DECLARE @VAR2 VARCHAR(2) 1.SELECT可以在

Ibatis中传List参数

Ibatis中用list传参数的方式. Java代码  select count(id) from `user` where id in #[]# and status=1 . 1 <select id="getcount" parameterClass="java.util.ArrayList" resultClass="int"> 2 select count(id) from `user` where id in 3 <i

ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...

ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data... 2012-07-18 11:21wuming3632171 | 浏览 5114 次 ibatis配置如下,高手帮我看看.<select id="exportRecieveData" parameterClass="java.util.HashMap"resultClass="

sql读写图片时Image.FromStream方法提示参数错误问题解决

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

sql中获得时间的参数

返回表示指定日期的指定日期部分的整数. 语法 DATEPART ( datepart , date ) 参数 datepart 指定要返回的日期部分的参数.有关详细信息,请参阅本主题后面的“备注”部分. date 返回 datetime 值(或可隐式转换为 datetime 值的值)的表达式.date 参数也可以是日期格式的字符串.datetime 数据类型仅用于 1753 年 1 月 1 日之后的日期. 对于之前的日期,将存储为字符数据.在输入 datetime 值时,请始终使用单引号将它们括

SQL中使用UPDATE更新数据时一定要记得WHERE子句

我们在使用 SQL 中的 UPDATE 更新数据时,一般都不会更新表中的左右数据,所以我们更新的数据的 SQL 语句中会带有 WHERE 子句,如果没有WHERE子句,就回更新表中所有的数据,在 mysql 中,我们可以设置sql_safe_updates 这个自带的参数来解决,,当该参数开启的情况下,我们必须在 UPDATE 语句后携带 WHERE 条件,否则就会报错.set sql_safe_updates=1; 表示开启该参数.下面是开启sql_safe_updates参数后不带  WHE

java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433

在节点 cnshh171Node01 上的服务器 server1 上,对数据源 testj2cbug 执行的测试连接操作由于以下异常 java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433 而失败. 查看 JVM 日志 JVM 日志: java.sql.SQLException: invalid arguments in call DSRA0010E: SQL State = null, Error Code =