MyBatisでのIN操作は、IDリストに従って一括更新されます


MyBatisでのIN操作
更新文を書くとき、私たちはこのようなビジネスに遭遇します.
選択した学生によって彼の点数を更新する
栗を挙げます.
UPDATE student 
SET score = 60
WHERE sid IN (168,199);

上記SQLはMySQLでの書き方です
では、MyBatisでは、IDリストを入力することで、対応するデータの更新をどのように行いますか?
前回の栗のMyBatis実行手順のコードを簡単に示します
StudentMapper.java(Mapperインタフェース)
void updateSelectedStudentScore(@Param("sIds")List sIds);

StudentMapper.xml
<update id="updateSelectedStudentScore" parameterType="arraylist">
        UPDATE student 
        SET score = 60
        WHERE
        <foreach collection="sIds" index="index" item="id" separator=","
                 open="sid IN (" close=")">
            #{id}
        foreach>
update>

foreach要素の属性は主にitem,index,collection,open,separator,closeである.
  • item:コレクション内の各要素が反復するときの別名
  • を表す.
  • index:反復中に反復するたびに反復する位置を表す名前を指定します.
  • は書きません.
  • open:文が何で始まるかを示す
  • separator:反復するたびにどのような記号を区切り記号とするかを示す
  • close:何で終わるかを表す
  • 詳細は公式ドキュメントをご覧ください
    MyBatis 3ドキュメント
    MyBatis Plusドキュメント
    反例を挙げる.
    これは私が書き始めたばかりの頃で、よく知らなかったので、以下のような間違いが発生しました.
    この文章で私の砂の彫刻の時刻を記録しますハハハハ
    私の例を学ばないでほしい.
    StudentService.java
    public void updateSelectedStudentScore(String sIds){
            List list = JSONObject.parseArray(sIds);
            StringBuilder idStr = new StringBuilder();
            for (int i = 0; i < list.size() - 1; i++) {
                idStr.append(list.get(i));
                idStr.append(",");
            }
            idStr.append(list.get(list.size() - 1));
    		studentMapper.updateSelectedStudentScore(idStr.toString());
        }
    

    フロントから送られてきたIDリストを受け取り、JSONObject.parseArray()でListに移行
    StudentMapper.java
    void updateSelectedStudentScore(@Param("sIds")String sIds);
    

    StudentMapper.xml
    <update id="updateSelectedAppMachineVersionAndIsUpdate" parameterType="String">
            UPDATE student 
            SET score = 60
            WHERE
        	sid IN (#{sIds})
    update>
    

    この時点で実行項目が表示されます
    com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated
    ### SQL: UPDATE student  SET score = 60, IS_UPDATE = 0  WHERE   SID IN (?)
    ### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '177,188,197'
    

    ネット上で検索して、この間違いに出会うのはすべて私ではありませんこの問題があるのはUPDATEデータの時SETの多列の間で“AND”を使うのがもたらしたのです例えばこの博文はData truncationが現れます
    あるいはデータベース符号化の問題です
    後で、入力された値がStringであることを考えると、「入力された値」というエラーが発生し、SQL文がエラーになります.本稿では,主に記録コード,記録Bug,記録技術に用いる.