1. 程式人生 > >記錄 - mybatis @Param引數繫結和批量插入

記錄 - mybatis @Param引數繫結和批量插入

需求:要在同一個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>