mybatis批量删除foreach报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis批量删除foreach报错相关的知识,希望对你有一定的参考价值。

这是mapper文件中的foreach循环
传入的是个List<Integet> 类型的集合,如11,12,13,14
然后报错如下,显示只能循环一个元素

介绍一种比较简单的批量操作,一个批量添加一个批量删除:
Java代码:
public class User implements Serializable
private Integer id;
private String name;
private String password;
//setter and getter

对应的Mapper.xml
<ResultMap type="User" id="UserResultMap">
<id column="id" property="id" jdbcType="Integer"/>
<result column="name" property="name" jdbcType="VARCHAR" />

<result column="password" property="password" jdbcType="VARCHAR" />
</ResultMap>

Mapper.xml中对应的批量插入方法:(传入的是一个List集合)
<insert id="add" useGeneratedKeys="true" parameterType="java.util.List">
<selectKey resultType="long" keyProperty="id" order="AFTER">
select last_insert_id()
</selectKey>
insert into t_user (name,password) values
<foreach collection="list" item="item" index="index" separator=",">
(#item.name,#item.password)
</foreach>
</insert>

Mapper.xml中对应的批量删除的方法:(传入的是一个string字符串,ids)
<delete
id="delete" parameterType="java.lang.String">
delete from t_user where id in (“$_param”);($好像是#号,记不太清了,可以试下)
</delete>

OK!追问

谢谢哈 你的那种方法我完了再看下 我有强迫症 你帮我看下我补充里面的那个哪里有问题 怎么解决哈 谢谢了亲 愁死我了

参考技术A <!--批量删除 -->
<delete id="batchDeletes" parameterType="java.util.List">
DELETE FROM tp_user where uname in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#item
</foreach>
</delete>
如上的mybatis指代的意思如下:
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名. (直接找到对应的delList集合里面的所有元素,item="item"中的item(后一个)必须与#item 中的item一致)
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束.
参考技术B 我也出现这个问题,我的解决是这条语句中有中文全角的空格所以报错,你可以看一下

解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

Mybatis批量插入需要foreach元素。foreach元素有以下主要属性:

 (1)item:集合中每一个元素进行迭代时的别名。

(2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置。

(3)collection:根据传入的参数值确定。

(4)open:表示该语句以什么开始。

(5)separator:表示在每次进行迭代之间以什么符号作为分隔 符。

(6)close:表示以什么结束。

首先,错误的xml配置文件如下:

<insert id="save" databaseId="oracle">
insert into "sys_user_role"
(
"user_id",
"role_id"
)values
<foreach collection="roleIdList" item="item" index="index" separator="," >
(
#{userId},
#{item}
)
</foreach>
</insert>

如果如上这样写就会报错:SQL 命令未正确结束。

经过修改后正确的xml配置文件如下:

<insert id="save" databaseId="oracle">
insert into "sys_user_role"
(
"user_id",
"role_id"
)
<foreach collection="roleIdList" item="item" index="index" separator="UNION ALL" >
SELECT
#{userId},
#{item}
FROM dual
</foreach>
</insert>

根据上下配置文件,需要注意三个地方:

(1)需要取掉values

(2)separator属性值改为UNION ALL。因为在oracle中用insert into xxx values (xxx,xxx),(xxx,xxx) 这种语法是通不过的

(3)foreach标签中需要取掉括号,加入select ..from dual.

























以上是关于mybatis批量删除foreach报错的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 批量删除 或者批量查询等等

最详细的MyBatis批量添加更新删除实战篇(日常开发)

Mybatis批量更新,批量删除

解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

JavaWeb学习笔记之Mybatis实用sql语句汇总

JavaWeb学习笔记之Mybatis实用sql语句汇总