【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
分类:
Java.Mybatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需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)