1:批量更新
批量插入有2种不同的SQL写法
1:直接在Foreach里面进行插入
<insert id="batchAddPerson" parameterType="com.mybatis.batch.pojo.Person">
<foreach collection="persons" item="person" index="index"
separator=";">
insert into person (name,age,sex)
VALUES
(
#{person.name},#{person.age},#{person.sex}
)
</foreach>
</insert>
结果:
Preparing: insert into person (name,age,sex) VALUES ( ?,?,? ) ; insert into person (name,age,sex) VALUES ( ?,?,? )
: ==> Parameters: 李5(String), 12(Integer), 1(Integer), 张4(String), 12(Integer), 1(Integer)
: <== Updates: 1
可以看到,最终的执行结果返回的数据库影响行数是1.但是数据还是插入了2条
说明:
上述方式相当语句逐条INSERT语句执行,将出现如下问题:
- mapper接口的add方法返回值将是最一条INSERT语句的操作成功的记录数目(就是0或1),
而不是所有INSERT语句的操作成功的总记录数目 这里是1
- mapper接口的add方法返回值将是最一条INSERT语句的操作成功的记录数目(就是0或1),
- 当其中一条不成功时,不会进行整体回滚。
- 3:还有一点很重要
separator=";"
这个里面是分号。相当于变成了2条SQL在执行了。这点可以从上面的
insert into person (name,age,sex) VALUES ( ?,?,? ) ;
insert into person (name,age,sex) VALUES ( ?,?,? ) 看出来,是2个SQL.
2:第二种批量插入的方法
<insert id="batchAddPerson" parameterType="com.mybatis.batch.pojo.Person">
insert into person (name,age,sex)
VALUES
<foreach collection="persons" item="person" index="index"
separator=",">
(
#{person.name},#{person.age},#{person.sex}
)
</foreach>
</insert>
这个是把insert into 放在最外层操作了,注意,这个separator="," 现在变成了逗号了。
最终结果:
Preparing: insert into person (name,age,sex) VALUES ( ?,?,? ) , ( ?,?,? )
: ==> Parameters: 李5(String), 12(Integer), 1(Integer), 张4(String), 12(Integer), 1(Integer)
: <== Updates: 2
- 1:拼接的SQL语句变成了 VALUES ( ?,?,? ) , ( ?,?,? ) 而不是两个单独的SQL语句了,
- 2:最后返回的 结果是2
- 3 :这个separator="," 现在变成了逗号了
网友评论