記錄 - mybatis @Param引數繫結和批量插入
阿新 • • 發佈:2018-11-19
需求:要在同一個groupId下批量插入單品。
資料庫如下:
CREATE TABLE `goods` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '單品id',
`url` varchar(300) NOT NULL COMMENT '圖片url',
`match_num` int(11) DEFAULT '0' COMMENT '被搭配次數',
`is_del` tinyint(1) DEFAULT '0' COMMENT '是否已刪除 0.未刪除,預設 1.已刪除',
`group_id` int(11) NOT NULL COMMENT '所在分組',
`source_id` int(11) NOT NULL COMMENT '圖片來源,0.本地相簿新增 1.別人分享的',
`user_id` int(11) NOT NULL COMMENT '所屬使用者',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '新增時間',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COMMENT='單品表';
Service和Mapper
//GoodsServiceImpl.java
public int batchAddGoods2Group(Integer groupId, List<Goods> goods) {
return goodsMapper.batchInsert(groupId, goods);
}
//GoodsMapper.java
int batchInsertSelective(@Param ("groupId") Integer groupId, @Param("list") List<Goods> goods);
GoodsMapper.xml
<!--批量插入單品-->
<insert id="batchInsertSelective">
insert into goods(
id,url,match_num,
is_del,group_id,source_id,
user_id,create_time,update_time)
values
<foreach collection="list" item="item" separator=",">
(#{item.id},
#{item.url},
#{item.matchNum},
#{item.isDel},
#{groupId}, //這裡就直接繫結groupId引數
#{item.sourceId},
#{item.userId},
now(),
now())
</foreach>
</insert>
[email protected]的使用
這裡使用@Param主要是為了在迴圈中直接繫結groupId,如果不這樣做的話,則只能使用#{item.groupId},也就需要手動在Sevice中setGroupId(groupId),顯然不太優雅。
for (Goods g : goods) {
g.setGroupId(groupId);
}
說明:如果傳入了多個引數,則parameterType就不用再設定了。因為parameterType只適合設定單個引數的場景。
2.批量insert
我發現批量操作很少會屬性可選的(selective)。不太清楚原因,網上翻遍了也沒有這種用法。我想可能的原因是,既然要批量,也就要保證列的統一,插入時必須統一都有某些屬性列,也就不用if判斷了。
我剛開始的sql如下,但是一直報錯,說引數id找不到,如果刪除id語句,又提示url找不到。
<!--批量插入單品-->
<insert id="batchInsertSelective" parameterType="java.util.List">
insert into goods
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="url != null">
url,
</if>
<if test="matchNum != null">
match_num,
</if>
<if test="isDel != null">
is_del,
</if>
<if test="groupId != null">
group_id,
</if>
<if test="sourceId != null">
source_id,
</if>
<if test="userId != null">
user_id,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
values
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
#{item.id},
</if>
<if test="url != null">
#{item.url},
</if>
<if test="matchNum != null">
#{item.matchNum},
</if>
<if test="isDel != null">
#{item.isDel},
</if>
<if test="groupId != null">
#{item.groupId},
</if>
<if test="sourceId != null">
#{item.sourceId},
</if>
<if test="userId != null">
#{item.userId},
</if>
<if test="createTime != null">
now(),
</if>
<if test="updateTime != null">
now(),
</if>
</trim>
</foreach>
</insert>