MyBatis中使用foreach批量插入並且返回自增id | MyBatis系列(小技巧一)

語言: CN / TW / HK

theme: scrolls-light

「這是我參與11月更文挑戰的第12天,活動詳情檢視:2021最後一次更文挑戰


  • 業務場景:
    • 簽到表是個流程,等到稽核完成後,需要將其從表資料自動新增至臺賬表中,方便臺賬表的匯出功能的開發。所以我們得獲取到批量插入的從表id,來維護主從表的關聯關係。
  • 具體實現:

    • 建立實體類:因為返回的id會自動注入進去,所以得選實體類來接收自增的id。

java @Data public class SignIn implements Serializable { private long id;//注意id為long型別 private String owner; private String modifier; private String last_modified; private String created_at; private String modified_method; private String app_key; private String app_extend_key; private String canjiayixiangxin; private String canjiashijian; private String canjiaren; private String yanlianliushuihao; }

  • mapper的編寫:
    • 注意點:正常的插入只需要parameterType=“”即可。
    • 我們需要返回id的話得多加以下三個:
    • useGeneratedKeys="true" :允許JDBC支援自動生成主鍵,需要驅動相容(如果設定為true則這個設定強制使用自動生成主鍵,儘管一些驅動不能相容但仍可正常工作)
    • keyProperty="id" :取id的key值
    • keyColumn="id":設值id的值

```java

<insert id="insertParameter"  useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
    insert into
        ${tableId}(
     owner,modifier,last_modified,created_at,modified_method,app_key,app_extend_key, canjiayixiangxin,canjiashijian,canjiaren,yanlianliushuihao)
    values
    <foreach collection="list" index="index" item="ids" separator=",">
        (
        #{ids.owner},#{ids.modifier},#{ids.last_modified},#{ids.created_at},#       {ids.modified_method},#{ids.app_key},#{ids.app_extend_key}, #{ids.canjiayixiangxin},#{ids.canjiashijian},#{ids.canjiaren},#{ids.yanlianliushuihao}
        )
    </foreach>
</insert>

```

  • service層:
  • 前提是已拿到所需要插入的資料集合了。
  • 注意點:網上大把部落格都忽略了一個點,大家也會經常遇到一個問題就是,返回的id在集合中會重複,下面會說下為什麼出現這樣的原因。
  • 原因 本質上我們批量插入時,是將一個實體類組成的集合執行插入語句,用foreach進行批量插入。
  • 我們將List> 型別轉成List<實體類>。使用mapToBean方法來轉換。
  • 因為我們是迴圈轉換的,所以每次都得在重新new一個物件,不然id就會被覆蓋。 java //如果資料為空,結束,不需要再執行下去 if (CollectionUtils.isEmpty(resultList)){ return; } //格式化時間 SimpleDateFormat sdfDay = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); List<SignIn> signInList = new ArrayList<>(); for (Map map : resultList){ map.put("created_at",sdfDay.format(map.get("created_at"))); map.put("canjiashijian",sdfDay.format(map.get("canjiashijian"))); map.put("last_modified",sdfDay.format(map.get("last_modified"))); map.remove("id"); //轉為實體類,這裡每次需要重新new一個物件,不然id會被覆蓋成最後一個的id SignIn signIn = new SignIn(); signInList.add(BeanUtils.mapToBean(map,signIn)); }
  • 這樣即可拿到所有插入的自增id。
  • 下面提供下Map轉實體的方法給大家:

```java public class BeanUtils {

private BeanUtils() {throw new IllegalStateException();
}
/**
 * map轉bean
 *
 * @param map
 * @param bean
 * @param <T>
 * @return
 */
public static <T> T mapToBean(Map<String, Object> map, T bean) {
    BeanMap beanMap = BeanMap.create(bean);
    beanMap.putAll(map);
    return bean;
}

} ```


路漫漫其修遠兮,吾必將上下求索~

如果你認為i博主寫的不錯!寫作不易,請點贊、關注、評論給博主一個鼓勵吧~hahah