Spring Boot DB連携

Oracle上でMyBatisを利用して複数レコードをまとめて追加/更新してみた

Spring BootとMyBatisを利用して、Oracleに接続するアプリケーション上では、引数に追加・更新対象データのリストを渡し、XMLファイル内のSQL文でforeach構文による繰り返し処理を行うことで、複数のレコードをまとめて追加・更新することができる。

今回は、Spring Bootアプリケーション内でMyBatisフレームワークを利用する状態で、Oracleに接続し、複数のレコードをまとめて追加・更新するサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

Oracle上でSpring Bootの@Transactionalアノテーションの挙動を調べてみたSpring Bootを利用したアプリケーションでDB接続を利用する際、@Transactionalアノテーションをつけたメソッド内でD...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

UserDataMapper.java、UserDataMapper.xmlの内容は以下の通りで、複数のレコードをまとめてUSER_DATAテーブルに追加/更新する処理と、USER_DATAテーブルの全データを取得する処理を追加している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.example.demo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserDataMapper {
/**
* 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて追加する.
* @param userDataList ユーザーデータテーブル(user_data)の追加データリスト
*/
void insertMulti(@Param("userDataList") List<UserData> userDataList);
/**
* 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて更新する.
* @param userDataList ユーザーデータテーブル(user_data)の更新データリスト
*/
void updateMulti(@Param("userDataList") List<UserData> userDataList);
/**
* ユーザーデータテーブル(user_data)のデータを全て取得する.
* @return ユーザーデータテーブル(user_data)のデータリスト
*/
List<UserData> findAll();
}
package com.example.demo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface UserDataMapper { /** * 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて追加する. * @param userDataList ユーザーデータテーブル(user_data)の追加データリスト */ void insertMulti(@Param("userDataList") List<UserData> userDataList); /** * 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて更新する. * @param userDataList ユーザーデータテーブル(user_data)の更新データリスト */ void updateMulti(@Param("userDataList") List<UserData> userDataList); /** * ユーザーデータテーブル(user_data)のデータを全て取得する. * @return ユーザーデータテーブル(user_data)のデータリスト */ List<UserData> findAll(); }
package com.example.demo;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserDataMapper {

    /**
     * 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて追加する.
     * @param userDataList ユーザーデータテーブル(user_data)の追加データリスト
     */
    void insertMulti(@Param("userDataList") List<UserData> userDataList);

    /**
     * 指定したユーザーデータテーブル(user_data)のデータのリストをまとめて更新する.
     * @param userDataList ユーザーデータテーブル(user_data)の更新データリスト
     */
    void updateMulti(@Param("userDataList") List<UserData> userDataList);

    /**
     * ユーザーデータテーブル(user_data)のデータを全て取得する.
     * @return ユーザーデータテーブル(user_data)のデータリスト
     */
    List<UserData> findAll();
}
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserDataMapper">
<resultMap id="userDataResultMap" type="com.example.demo.UserData" >
<id column="id" property="id" jdbcType="BIGINT" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="birthY" property="birthY" jdbcType="VARCHAR" />
<result column="birthM" property="birthM" jdbcType="VARCHAR" />
<result column="birthD" property="birthD" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="VARCHAR" />
<result column="memo" property="memo" jdbcType="VARCHAR" />
<result column="sex_value" property="sex_value" jdbcType="VARCHAR" />
</resultMap>
<insert id="insertMulti" parameterType="java.util.List">
INSERT INTO USER_DATA (
id
, name
, birth_year
, birth_month
, birth_day
, sex
, memo
)
<foreach collection="userDataList" item="userData" separator="union all">
( SELECT
#{userData.id}
, #{userData.name}
, #{userData.birthY}
, #{userData.birthM}
, #{userData.birthD}
, #{userData.sex}
, #{userData.memo,jdbcType=VARCHAR}
FROM DUAL
)
</foreach>
</insert>
<update id="updateMulti" parameterType="java.util.List">
BEGIN
<foreach collection="userDataList" item="userData" separator=";">
UPDATE USER_DATA
<set>
name = #{userData.name}
, birth_year = #{userData.birthY}
, birth_month = #{userData.birthM}
, birth_day = #{userData.birthD}
, sex = #{userData.sex}
, memo = #{userData.memo,jdbcType=VARCHAR}
</set>
WHERE id = #{userData.id}
</foreach>
;END;
</update>
<select id="findAll" resultMap="userDataResultMap">
SELECT
id
, name
, birth_year as birthY
, birth_month as birthM
, birth_day as birthD
, sex
, memo
, CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE ''
END AS sex_value
FROM USER_DATA
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.UserDataMapper"> <resultMap id="userDataResultMap" type="com.example.demo.UserData" > <id column="id" property="id" jdbcType="BIGINT" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="birthY" property="birthY" jdbcType="VARCHAR" /> <result column="birthM" property="birthM" jdbcType="VARCHAR" /> <result column="birthD" property="birthD" jdbcType="VARCHAR" /> <result column="sex" property="sex" jdbcType="VARCHAR" /> <result column="memo" property="memo" jdbcType="VARCHAR" /> <result column="sex_value" property="sex_value" jdbcType="VARCHAR" /> </resultMap> <insert id="insertMulti" parameterType="java.util.List"> INSERT INTO USER_DATA ( id , name , birth_year , birth_month , birth_day , sex , memo ) <foreach collection="userDataList" item="userData" separator="union all"> ( SELECT #{userData.id} , #{userData.name} , #{userData.birthY} , #{userData.birthM} , #{userData.birthD} , #{userData.sex} , #{userData.memo,jdbcType=VARCHAR} FROM DUAL ) </foreach> </insert> <update id="updateMulti" parameterType="java.util.List"> BEGIN <foreach collection="userDataList" item="userData" separator=";"> UPDATE USER_DATA <set> name = #{userData.name} , birth_year = #{userData.birthY} , birth_month = #{userData.birthM} , birth_day = #{userData.birthD} , sex = #{userData.sex} , memo = #{userData.memo,jdbcType=VARCHAR} </set> WHERE id = #{userData.id} </foreach> ;END; </update> <select id="findAll" resultMap="userDataResultMap"> SELECT id , name , birth_year as birthY , birth_month as birthM , birth_day as birthD , sex , memo , CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '' END AS sex_value FROM USER_DATA </select> </mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserDataMapper">
    <resultMap id="userDataResultMap" type="com.example.demo.UserData" >
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="birthY" property="birthY" jdbcType="VARCHAR" />
        <result column="birthM" property="birthM" jdbcType="VARCHAR" />
        <result column="birthD" property="birthD" jdbcType="VARCHAR" />
        <result column="sex" property="sex" jdbcType="VARCHAR" />
        <result column="memo" property="memo" jdbcType="VARCHAR" />
        <result column="sex_value" property="sex_value" jdbcType="VARCHAR" />
    </resultMap>
    <insert id="insertMulti" parameterType="java.util.List">
        INSERT INTO USER_DATA (
              id
            , name
            , birth_year
            , birth_month
            , birth_day
            , sex
            , memo
        )
        <foreach collection="userDataList" item="userData" separator="union all">
            ( SELECT
                  #{userData.id}
                , #{userData.name}
                , #{userData.birthY}
                , #{userData.birthM}
                , #{userData.birthD}
                , #{userData.sex}
                , #{userData.memo,jdbcType=VARCHAR}
              FROM DUAL
            )
        </foreach>
    </insert>
    <update id="updateMulti" parameterType="java.util.List">
        BEGIN
        <foreach collection="userDataList" item="userData" separator=";">
            UPDATE USER_DATA
            <set>
                  name = #{userData.name}
                , birth_year = #{userData.birthY}
                , birth_month = #{userData.birthM}
                , birth_day = #{userData.birthD}
                , sex = #{userData.sex}
                , memo = #{userData.memo,jdbcType=VARCHAR}
            </set>
            WHERE id = #{userData.id}
        </foreach>
        ;END;
    </update>
    <select id="findAll" resultMap="userDataResultMap">
        SELECT
              id
            , name
            , birth_year as birthY
            , birth_month as birthM
            , birth_day as birthD
            , sex
            , memo
            , CASE sex
              WHEN '1' THEN '男'
              WHEN '2' THEN '女'
              ELSE ''
              END AS sex_value
        FROM USER_DATA
    </select>
</mapper>

また、サービスクラスの内容は以下の通りで、複数のレコードをまとめてuser_dataテーブルに追加/更新する処理の呼び出しを行っている。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
public class DemoService {
/**
* ユーザーデータテーブル(user_data)へアクセスするマッパー
*/
@Autowired
private UserDataMapper userDataMapper;
/**
* ユーザーデータテーブル(user_data)のデータをまとめて追加する.
*/
@Transactional
public void insertMultiData() {
// 更新前のユーザーデータテーブルのデータを出力する
List<UserData> userDataListReg = userDataMapper.findAll();
System.out.println("更新前データ : ");
printUserDataList(userDataListReg);
// ユーザーデータテーブルに複数レコードをまとめて追加する.
List<UserData> userDataList = new ArrayList<>();
userDataList.add(makeUserData(1));
userDataList.add(makeUserData(2));
userDataList.add(makeUserData(3));
userDataMapper.insertMulti(userDataList);
// 更新後のユーザーデータテーブルのデータを出力する
List<UserData> userDataListUpd = userDataMapper.findAll();
System.out.println("更新後データ : ");
printUserDataList(userDataListUpd);
}
/**
* ユーザーデータテーブル(user_data)のデータをまとめて更新する.
*/
@Transactional
public void updateMultiData() {
// 更新前のユーザーデータテーブルのデータを出力する
List<UserData> userDataListReg = userDataMapper.findAll();
System.out.println("更新前データ : ");
printUserDataList(userDataListReg);
// ユーザーデータテーブルの複数レコードをまとめて更新する.
for (UserData userData : userDataListReg) {
makeUserDataUpd(userData);
}
userDataMapper.updateMulti(userDataListReg);
// 更新後のユーザーデータテーブルのデータを出力する
List<UserData> userDataListUpd = userDataMapper.findAll();
System.out.println("更新後データ : ");
printUserDataList(userDataListUpd);
}
/**
* 引数のIDをもつユーザーデータを生成する.
* @param id ID
* @return ユーザーデータ
*/
private UserData makeUserData(int id) {
UserData userData = new UserData();
userData.setId(id);
userData.setName("テスト プリン" + id);
userData.setSex(Integer.toString(id % 2 + 1));
userData.setBirthY(2012);
userData.setBirthM(1);
userData.setBirthD(15);
userData.setMemo("テスト" + id);
return userData;
}
/**
* 引数のユーザーデータの名前・メモを更新する.
* @param userData ユーザーデータ
*/
private void makeUserDataUpd(UserData userData) {
userData.setName(userData.getName() + " 更新後");
userData.setMemo(userData.getMemo() + " 更新後");
}
/**
* 引数のユーザーデータリストの中身を出力する.
* @param userDataList ユーザーデータリスト
*/
private void printUserDataList(List<UserData> userDataList) {
if (userDataList == null || userDataList.size() == 0) {
System.out.println("ユーザーデータはありません。");
} else {
for (UserData userData : userDataList) {
System.out.println(userData);
}
}
System.out.println();
}
}
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @Service public class DemoService { /** * ユーザーデータテーブル(user_data)へアクセスするマッパー */ @Autowired private UserDataMapper userDataMapper; /** * ユーザーデータテーブル(user_data)のデータをまとめて追加する. */ @Transactional public void insertMultiData() { // 更新前のユーザーデータテーブルのデータを出力する List<UserData> userDataListReg = userDataMapper.findAll(); System.out.println("更新前データ : "); printUserDataList(userDataListReg); // ユーザーデータテーブルに複数レコードをまとめて追加する. List<UserData> userDataList = new ArrayList<>(); userDataList.add(makeUserData(1)); userDataList.add(makeUserData(2)); userDataList.add(makeUserData(3)); userDataMapper.insertMulti(userDataList); // 更新後のユーザーデータテーブルのデータを出力する List<UserData> userDataListUpd = userDataMapper.findAll(); System.out.println("更新後データ : "); printUserDataList(userDataListUpd); } /** * ユーザーデータテーブル(user_data)のデータをまとめて更新する. */ @Transactional public void updateMultiData() { // 更新前のユーザーデータテーブルのデータを出力する List<UserData> userDataListReg = userDataMapper.findAll(); System.out.println("更新前データ : "); printUserDataList(userDataListReg); // ユーザーデータテーブルの複数レコードをまとめて更新する. for (UserData userData : userDataListReg) { makeUserDataUpd(userData); } userDataMapper.updateMulti(userDataListReg); // 更新後のユーザーデータテーブルのデータを出力する List<UserData> userDataListUpd = userDataMapper.findAll(); System.out.println("更新後データ : "); printUserDataList(userDataListUpd); } /** * 引数のIDをもつユーザーデータを生成する. * @param id ID * @return ユーザーデータ */ private UserData makeUserData(int id) { UserData userData = new UserData(); userData.setId(id); userData.setName("テスト プリン" + id); userData.setSex(Integer.toString(id % 2 + 1)); userData.setBirthY(2012); userData.setBirthM(1); userData.setBirthD(15); userData.setMemo("テスト" + id); return userData; } /** * 引数のユーザーデータの名前・メモを更新する. * @param userData ユーザーデータ */ private void makeUserDataUpd(UserData userData) { userData.setName(userData.getName() + " 更新後"); userData.setMemo(userData.getMemo() + " 更新後"); } /** * 引数のユーザーデータリストの中身を出力する. * @param userDataList ユーザーデータリスト */ private void printUserDataList(List<UserData> userDataList) { if (userDataList == null || userDataList.size() == 0) { System.out.println("ユーザーデータはありません。"); } else { for (UserData userData : userDataList) { System.out.println(userData); } } System.out.println(); } }
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
public class DemoService {

    /**
     * ユーザーデータテーブル(user_data)へアクセスするマッパー
     */
    @Autowired
    private UserDataMapper userDataMapper;

    /**
     * ユーザーデータテーブル(user_data)のデータをまとめて追加する.
     */
    @Transactional
    public void insertMultiData() {
        // 更新前のユーザーデータテーブルのデータを出力する
        List<UserData> userDataListReg = userDataMapper.findAll();
        System.out.println("更新前データ : ");
        printUserDataList(userDataListReg);

        // ユーザーデータテーブルに複数レコードをまとめて追加する.
        List<UserData> userDataList = new ArrayList<>();
        userDataList.add(makeUserData(1));
        userDataList.add(makeUserData(2));
        userDataList.add(makeUserData(3));
        userDataMapper.insertMulti(userDataList);

        // 更新後のユーザーデータテーブルのデータを出力する
        List<UserData> userDataListUpd = userDataMapper.findAll();
        System.out.println("更新後データ : ");
        printUserDataList(userDataListUpd);
    }

    /**
     * ユーザーデータテーブル(user_data)のデータをまとめて更新する.
     */
    @Transactional
    public void updateMultiData() {
        // 更新前のユーザーデータテーブルのデータを出力する
        List<UserData> userDataListReg = userDataMapper.findAll();
        System.out.println("更新前データ : ");
        printUserDataList(userDataListReg);

        // ユーザーデータテーブルの複数レコードをまとめて更新する.
        for (UserData userData : userDataListReg) {
            makeUserDataUpd(userData);
        }
        userDataMapper.updateMulti(userDataListReg);

        // 更新後のユーザーデータテーブルのデータを出力する
        List<UserData> userDataListUpd = userDataMapper.findAll();
        System.out.println("更新後データ : ");
        printUserDataList(userDataListUpd);
    }

    /**
     * 引数のIDをもつユーザーデータを生成する.
     * @param id ID
     * @return ユーザーデータ
     */
    private UserData makeUserData(int id) {
        UserData userData = new UserData();
        userData.setId(id);
        userData.setName("テスト プリン" + id);
        userData.setSex(Integer.toString(id % 2 + 1));
        userData.setBirthY(2012);
        userData.setBirthM(1);
        userData.setBirthD(15);
        userData.setMemo("テスト" + id);
        return userData;
    }

    /**
     * 引数のユーザーデータの名前・メモを更新する.
     * @param userData ユーザーデータ
     */
    private void makeUserDataUpd(UserData userData) {
        userData.setName(userData.getName() + " 更新後");
        userData.setMemo(userData.getMemo() + " 更新後");
    }

    /**
     * 引数のユーザーデータリストの中身を出力する.
     * @param userDataList ユーザーデータリスト
     */
    private void printUserDataList(List<UserData> userDataList) {
        if (userDataList == null || userDataList.size() == 0) {
            System.out.println("ユーザーデータはありません。");
        } else {
            for (UserData userData : userDataList) {
                System.out.println(userData);
            }
        }
        System.out.println();
    }
}

さらに、Spring Bootのメインクラスの内容は以下の通りで、サービスクラスの各メソッドを呼び出している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
/**
* ユーザーデータテーブル(user_data)を更新する
* トランザクションを含むサービス
*/
@Autowired
private DemoService demoService;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) {
try {
// ユーザーデータテーブル(user_data)をまとめて
// 追加または更新するメソッドを呼び出す
demoService.insertMultiData();
//demoService.updateMultiData();
} catch (Exception ex) {
System.err.println(ex);
}
}
}
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication implements CommandLineRunner { /** * ユーザーデータテーブル(user_data)を更新する * トランザクションを含むサービス */ @Autowired private DemoService demoService; public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) { try { // ユーザーデータテーブル(user_data)をまとめて // 追加または更新するメソッドを呼び出す demoService.insertMultiData(); //demoService.updateMultiData(); } catch (Exception ex) { System.err.println(ex); } } }
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    /**
     * ユーザーデータテーブル(user_data)を更新する
     * トランザクションを含むサービス
     */
    @Autowired
    private DemoService demoService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) {
        try {
            // ユーザーデータテーブル(user_data)をまとめて
            // 追加または更新するメソッドを呼び出す
            demoService.insertMultiData();
            //demoService.updateMultiData();
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }

}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-oracle-multi-insert-update/demo



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は以下の通りで、複数のレコードをまとめて追加・更新する処理が実行できることが確認できる。

1) 以下のように、DemoApplicationクラスで、複数のレコードをまとめて追加する処理(demoServiceクラスのinsertMultiDataメソッド)を有効にする。
サンプルプログラムの実行結果_1

2) 更新対象のUSER_DATAテーブルを、以下のように、全件削除した状態にする。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
select * from user_data order by id asc
select * from user_data order by id asc
select * from user_data order by id asc
サンプルプログラムの実行結果_2

3) 1)2)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果_3

4) 3)を実行後のUSER_DATAテーブルの中身は以下の通りで、複数のレコードをまとめて追加できたことが確認できる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
select * from user_data order by id asc
select * from user_data order by id asc
select * from user_data order by id asc
サンプルプログラムの実行結果_4

5) 以下のように、DemoApplicationクラスで、複数のレコードをまとめて更新する処理(demoServiceクラスのupdateMultiDataメソッド)を有効にする。
サンプルプログラムの実行結果_5

6) 4)5)の状態でSpring Bootのメインクラス(DemoApplication.java)を実行した結果、コンソールログに出力される内容は以下の通り。
サンプルプログラムの実行結果_6

7) 6)を実行後のUSER_DATAテーブルの中身は以下の通りで、複数のレコードのNAME, MEMOの値をまとめて更新できたことが確認できる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
select * from user_data order by id asc
select * from user_data order by id asc
select * from user_data order by id asc
サンプルプログラムの実行結果_7

要点まとめ

  • Spring BootとMyBatisを利用して、Oracleに接続するアプリケーション上では、引数に追加・更新対象データのリストを渡し、XMLファイル内のSQL文でforeach構文による繰り返し処理を行うことで、複数のレコードをまとめて追加・更新することができる。