mybatis批量插入,更新,删除

MySQL中,insert后面带上 on duplicate key update 子句,数据库中存在记录时,执行这个语句会更新,而不存在这条记录时,就会插入。 
insert into tablename(field1,field2,field3,......) values(value1,value2,value3,....) on duplicate key update field1=values(value1),field2=values(value2),field3=values(value3),......;
 insert into `person_device`(`person_id`,`device_id`,`type`)
        values
        <foreach collection="list" separator="," item="item">
            (#{item.personId}, #{item.deviceId}, #{item.type})
        </foreach>
        on duplicate key update `type`=values(`type`)

//重复主键不插入
INSERT IGNORE INTO 表示,检查主键(PrimaryKey)可能是联合主键,如果数据库中已经存在相同的记录,则忽略当前新数据插入;
    <insert id="batchInsertPersonDevice">
        insert ignore into `person_device`(`person_id`,`device_id`,`type`)
        values
        <foreach collection="list" separator="," item="item">
            (#{item.personId}, #{item.deviceId},0)
        </foreach>
    </insert>

输出
==>  Preparing: insert ignore into person_office(person_id,office_id) values (?,?)
==> Parameters: 2(Integer), 10000(String)
<==    Updates: 0

<insert id="batchInserOrUpdate">
  insert into fnd_dept(
                       dept_code,
                       dept_name,
                       parent_dept_code,
                       type,
                       dept_type,
                       status,
                       order_num,
                       memo,
                       dept_path,
                       dept_name_path,
                       creation_date,
                       last_update_date,
                       created_by,
                       last_updated_by)
    values
    <foreach collection="list" separator="," item="item">
        (
         #{item.deptCode},
         #{item.deptName},
         #{item.parentDeptCode},
         #{item.type},
         #{item.deptType},
         #{item.status},
         #{item.orderNum},
         #{item.memo},
         #{item.deptPath},
         #{item.deptNamePath},
         SYSDATE(),
         SYSDATE(),
        'admin',
        'admin'
        )
    </foreach>
    on duplicate key
        update  dept_name=values(dept_name),
                parent_dept_code=values(parent_dept_code),
                type=values(type),
                dept_type=values(dept_type),
                status=values(status),
                order_num=values(order_num),
                memo=values(memo),
                dept_path=values(dept_path),
                dept_name_path=values(dept_name_path),
                last_updated_by="admin",
                last_update_date=SYSDATE()

</insert>

//批量删除 (or条件)
    <delete id="issueFeginDeleteUser">
            DELETE FROM person_device
            WHERE
            <foreach collection="list" separator="or" item="item">
                (person_id=#{item.personId} AND device_id=#{item.deviceId})
            </foreach>
    </delete>

输出
==>  Preparing: DELETE FROM person_device WHERE (person_id=? AND device_id=?) or (person_id=? AND device_id=?) or (person_id=? AND device_id=?)
==> Parameters: 3(Integer), CH3U212760001(String), 100(Integer), CH3U212760001(String), 12(Integer), CH3U212760001(String)
<==    Updates: 0


//批量updte (ignore可以去掉)
<update id="batchUpdate">
        <foreach collection="list" item="item" separator=";">
            update ignore person_device
            <set>
                device_id=#{item.deviceId}
            </set>
            <where>
                person_id=#{item.personId}
            </where>
        </foreach>
   </update>

输出
==>  Preparing: update ignore person_device SET device_id=? WHERE person_id=?
==> Parameters: CH3U212760002(String), 2(Integer)
<==    Updates: 0
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,可以使用foreach标签来实现批量插入操作。foreach标签可以用于循环遍历集合或数组,并执行相应的SQL语句。以下是几个示例: 1. 使用foreach批量删除数据: ``` delete from xxx_table where id in <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> => (1,2,3,4) ``` 2. 使用foreach批量插入数据: ``` <insert id="batchInsert"> insert into ref_teacher_course (teacher_id,course_id,create_time,update_time) values <foreach collection="teacherCourseList.CourseList" item="item" index="index" separator=","> (#{teacherCourseList.username}, #{item}, #{teacherCourseList.create_time}, #{teacherCourseList.update_time}) </foreach> </insert> ``` 3. 在Mapper接口中定义批量保存方法: ``` @Mapper public interface UserMapper { void batchSave(List<User> userList); } ``` 4. 使用foreach批量保存数据: ``` <insert id="batchSave"> <foreach collection="list" item="user" separator=";"> insert into user(name, password) values (#{user.name}, #{user.password}) </foreach> </insert> ``` 在测试类中调用批量保存方法: ``` @RunWith(SpringRunner.class) @SpringBootTest public class SbMybatis02ApplicationTests { @Test public void testBatchSave(){ User user1 = new User(); user1.setName("关羽"); user1.setPassword("guanyu"); User user2 = new User(); user2.setName("张飞"); user2.setPassword("zhangfei"); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); userMapper.batchSave(userList); } } ``` 以上就是使用MyBatis中的foreach实现批量插入的示例。使用foreach可以简化批量操作的编写,提高效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Mybatis批量添加(foreach标签)](https://blog.csdn.net/m0_51212267/article/details/121641252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [MyBatis 使用 foreach 批量插入](https://blog.csdn.net/lizhengyu891231/article/details/125546407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值