【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM