mybatis實現批量插入並返回主鍵(xml和註解兩種方法)

mybatis批量插入並返回主鍵(xml和註解兩種方法)

mybatis批量插入

在mysql數據庫中支持批量插入,所以隻要配置useGeneratedKeys和keyProperty就可以批量插入並返回主鍵瞭。

比如有個表camera,裡面有cameraNo,chanIndex,cameraName這三個字段,其中cameraNo是自增主鍵。

下面是批量插入的Dao層接口:

void batchInsertCameras(@Param("list") List<Camera> cameras);

xml形式

<insert id="batchInsertCameras" useGeneratedKeys="true" keyProperty="cameraNo">
    insert into camera (chanIndex,cameraName)
    values
    <foreach collection="list" item="c" separator=",">
        (#{c.chanIndex},#{c.cameraName})
    </foreach>
</insert>

註解形式

@Insert("<script>insert into camera (chanIndex,cameraName) values " +
        "<foreach collection='list' item='c' separator=','>(#{c.chanIndex},#{c.cameraName})</foreach></script>")
@Options(useGeneratedKeys = true, keyProperty = "cameraNo")
void batchInsertCameras(@Param("list") List<Camera> cameras);

註意:@Param裡必須寫成list, foreach的collection也必須寫成list,否則批量插入後會報錯說找不到”cameraNo”字段,而無法返回主鍵。

通過上面的xml形式或者註解形式的配置(我這是spring boot的項目,引入的mybatis-spring-boot-starter,采用的是註解形式),就可以批量插入並返回主鍵瞭,主鍵會被設置到Camera對象的cameraNo字段中。

cameraMapper.batchInsertCameras(cameras);
for(Camera camera : cameras){
    System.out.println(camera.getCameraNo());
}

執行批量插入時,需確保至少有一條待插入的記錄,否則會導致sql有誤而報錯。

mybatis批量插入並返回主鍵筆記

mapper中的代碼

int insertBatchUserReturnId(List<User> users);

也可以在形參前面加上@Param(“xxxx”)

xml中的代碼,collection必須填list類型

<insert id="insertBatchUserReturnId" keyProperty="userId" useGeneratedKeys="true">
 insert into message (user_id, user_name, user_type, user_passwd, user_phone,user_pic,user_address)
 values
 <foreach collection="list" item="item" open="(" close=")" separator=",">
  #{item.userId,jdbcType=INTEGER}, #{item.userName,jdbcType=VARCHAR}, #{item.userType,jdbcType=TINYINT}, 
  #{item.userPasswd,jdbcType=VARCHAR}, #{item.userPhone,jdbcType=VARCHAR},
  #{item.userPic,jdbcType=VARCHAR},#{item.userAddress,jdbcType=VARCHAR}
 </foreach>
</insert>

執行完這條語句之後,原來的users就會自動帶上主鍵userId。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: