■Userテーブルの最新の血液型を登録
以下を考慮
・COMPANYテーブルに存在するがUSERテーブルに存在しないUSER_IDが引数に指定された場合にnullを登録
【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。
・USERテーブルに引数のidを持つレコードが存在しない場合は血液型にNULLを登録する。
登録はUPDATE部分がINSERTに変わるイメージ
<update id="bulkUpdateCompany">
<foreach item="item" collection="list" separator=";">
UPDATE COMPANY
SET
name = #{item.name},
age = #{item.age},
blood_type = CASE
WHEN user_id IN (SELECT user_id FROM USER) THEN (
SELECT blood_type
FROM USER
WHERE USER.user_id = COMPANY.user_id
AND USER.user_id = #{item.userId}
AND USER.upd_time = (
SELECT MAX(upd_time)
FROM USER
WHERE user_id = USER.user_id
)
)
ELSE NULL
END
WHERE user_id = #{item.userId}
</foreach>
</update>
foreach要素:
collection="list": Javaから渡されたListをループ処理します。
item="item": ループ内の各エンティティをitemという名前で参照します。
separator=";": 各UPDATE文をセミコロンで区切ります。
UPDATE文:
UPDATE COMPANY: COMPANYテーブルを更新します。
SET name = #{item.name}, age = #{item.age}: エンティティのnameとageフィールドの値をCOMPANYテーブルの対応するカラムに設定します。
SET blood_type = CASE ... END: blood_typeカラムの値を条件に応じて設定します。
WHEN user_id IN (SELECT user_id FROM USER) THEN ...: USERテーブルに存在するuser_idの場合、USERテーブルからblood_typeを取得して設定します。
ELSE NULL: USERテーブルに存在しないuser_idの場合、NULLを設定します。
WHERE user_id = #{item.userId}: エンティティのuserIdフィールドの値に基づいて更新対象の行を特定します。
以下は単に検索対象から除外する。
<update id="bulkUpdateBloodType">
UPDATE COMPANY
SET blood_type = (
SELECT blood_type
FROM USER
WHERE USER.user_id = COMPANY.user_id
AND USER.user_id IN
<foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
AND USER.upd_time = (
SELECT MAX(upd_time)
FROM USER
WHERE user_id = USER.user_id
)
)
WHERE user_id IN
<foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
AND user_id IN (
SELECT user_id
FROM USER
)
</update>
USERテーブルの更新の後に実行(登録処理でも同じものを実行)
テーブル名がUSERの場合、以下の処理を実施
()selectUserlist.size()分以下の処理を繰り返し(変数はuser)
()user.getUserIdでuserIdを取得
()取得したidで重複を削除し、idが重複していないidListを作成
dao.insertOrUpdate(UserMapper,"updateBloodType",idList)を実行し、
血液型を更新
List<Integer> distinctUserIdList = userList.stream()
.map(User::getUserId) // UserオブジェクトからuserIdを抽出
.distinct() // 重複を削除
.collect(Collectors.toList()); // リストに変換
【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。
<update id="bulkUpdateBloodType">
UPDATE COMPANY
SET blood_type = (
SELECT blood_type
FROM USER
WHERE USER.user_id = COMPANY.user_id
AND USER.user_id IN
<foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
AND USER.upd_time = (
SELECT MAX(upd_time)
FROM USER
WHERE user_id = USER.user_id
)
)
WHERE user_id IN
<foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach>
</update>
■HTTPリクエスト
()send以前のエラー→開発段階でしか起こらない
例外が発生した場合、ログを出力 スロー市内
()send以後のエラー→運用で起こりうる
エラーと、HTTPリクエストの失敗をログ出力 スローはしない。
■nepo機能について
*更新するテーブルと登録するテーブルはイコールではないので、
テーブル名を確認するif文が必要 あとは同じ
■eteled機能について
新規登録処理をdeleteに変えればいい。
daoクラスも更新新規のやつをdeleteにする