【實驗用到的數據庫】
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