MyBatis中使用foreach批量插入並且返回自增id | MyBatis系列(小技巧一)
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
- 因為我們是迴圈轉換的,所以每次都得在重新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
「其他文章」
- 2021已逝,2022我來了 | 2021年終總結
- SpringBoot整合Swagger(十一)常用註解介紹 | Java隨筆記
- SpringBoot整合Swagger(十)常用註解介紹 | Java隨筆記
- 將數字變成 0 的操作次數 | LeetCode刷題筆記
- SpringBoot整合Swagger(九)給你的Swagger換個面板吧 | Java隨筆記
- SpringBoot整合Swagger(八)@ApiModelProperty()註解一擼到底 | Java隨筆記
- SpringBoot整合Swagger(七)@ApiModel()註解一通百通 | Java隨筆記
- SpringBoot整合Swagger(六)玩轉groupName()分組 | Java隨筆記
- SpringBoot整合Swagger(五)動態配製Swagger的開關 | Java隨筆記
- SpringBoot整合Swagger(三)paths()介面過濾 | Java隨筆記
- 隨機數實現撲克牌洗牌 | Java隨筆記
- 線上出問題?遠端DeBug會嗎?| Java隨筆記
- Widows和Linux下如何安裝MySQL | MySQL(前傳)
- Ubuntu新增root使用者和開啟遠端登陸 | Java隨筆記
- Ubuntu16.04上安裝jdk1.8 | Java隨筆記
- Java函式和陣列 | Java隨筆記
- 程式設計師最喜歡的一句話?當然是New物件啦~ | Java隨筆記
- MyBatis中使用foreach批量插入並且返回自增id | MyBatis系列(小技巧一)
- 操作資料庫和資料表 | MySQL(一)基礎
- @Value註解讀取配置檔案中的內容 | Java隨筆記