自分用メモ

■Userテーブルの最新の血液型を登録

以下を考慮
・COMPANYテーブルに存在するがUSERテーブルに存在しないUSER_IDが引数に指定された場合にnullを登録

【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。
・USERテーブルに引数のidを持つレコードが存在しない場合は血液型にNULLを登録する。

登録はUPDATE部分がINSERTに変わるイメージ

```SQLIdea1.xml
<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<Entity>をループ処理します。
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フィールドの値に基づいて更新対象の行を特定します。


以下は単に検索対象から除外する。

```SQLIdea2.xml
<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)を実行し、
血液型を更新
   
```idListIdea.java
 List<Integer> distinctUserIdList = userList.stream()
                .map(User::getUserId) // UserオブジェクトからuserIdを抽出
                .distinct() // 重複を削除
                .collect(Collectors.toList()); // リストに変換
```

【補足】Company.xmlに記載するsqlは以下を考慮した内容にする(CompanySide.xmlについても同様)
・USERテーブルの引数のidを持つ最新のレコードの血液型をCOMPANYテーブルの血液型に設定する。

```SQLIdea2.xml
<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にする