【Mybatis】Mybatis的批量执行SQL语句 与 返回值问题

【实验用到的数据库】

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

【实验用到的Mybatis版本】

       <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>

【使用到的表及原始数据】

复制代码
create table test04(
    id number(3),
    name nvarchar2(20),
    age number(3),
    primary key(id)
)

insert into test04(id,name,age) values('1','andy','22');
insert into test04(id,name,age) values('2','bill','23');
insert into test04(id,name,age) values('3','cindy','24');
insert into test04(id,name,age) values('4','douglas','25');
复制代码

【Mapper.xml写法】

复制代码
    <update id="updateTest2">
        BEGIN
        <choose>
            <when test="list!=null">
                <foreach collection="list" item="emp">
                    update test04 set name=#{emp.name} where age=#{emp.age};
                </foreach>
            </when>
        </choose>
        END;
    </update>
复制代码

【对应函数】

复制代码
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

@Mapper
public interface Test03Mapper {
......
    int updateTest2(List<Emp> list);
}
复制代码

【调用】

复制代码
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MybaticUpdateTest2 {
    public static void main(String[] args) throws Exception{
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            Test03Mapper mapper = session.getMapper(Test03Mapper.class);

            List<Emp> list=new ArrayList<>();
            list.add(new Emp("Andy11",44));
            list.add(new Emp("Bill1",33));

            int cnt = mapper.updateTest2(list);
            System.out.println(cnt);

            session.commit();
        }
    }
}
复制代码

【关于返回值的问题】

最尴尬的是,批量执行SQL语句后,无论数据库里被改了几条记录,返回值总是-1 !

而且,加了以下设置也无效:

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="defaultExecutorType" value="SIMPLE"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
                <property name="username" value="luna"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="Test03Mapper.xml"/>
    </mappers>
</configuration>
复制代码

这和单条执行SQL,更新几条就返回几是不一样的。

因此,批量更新后,不该拿返回值做判断。

真要取变更记录数,当在java程序里循环,取单条更新语句的结果进行累计。

【使用到的程序】

大家可自行做实验。

 https://files.cnblogs.com/files/heyang78/RestAccessEs_220303AM.rar?t=1646275138

END

posted @   逆火狂飙  阅读(950)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2020-03-03 zt:HttpUrlConnection使用详解
2020-03-03 使用HttpUrlConnection访问www.163.com遇到503问题,用设置代理加以解决
2019-03-03 【Canvas与艺术】模拟五个桌球在球桌上进行完全弹性碰撞
2019-03-03 [Canvas与艺术]带尾迹的下雪效果
2019-03-03 【Canvas与诗词】夏日绝句 李清照
2019-03-03 【Canvas与光阑】四条C形色带填满一个圆/环形
2019-03-03 【Canvas与艺术】自制朝阳电脑桌面(1920*1080)
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示