mybatis 的批量操作,查询、更新、插入

批量查询

传入ID查询

传入一个多个id用,拼接的字符串 “1,2,3,4,“ 进行批量查询
注意:传入字符串时,记得切分为 字符串数组
dao 接口

List<Situation> getByIds(String[] ids);

mapper

<select id="getByIds" parameterType="java.util.Arrays" resultMap="situationMap">
        SELECT *
        FROM situation s
        WHERE s.id in
        <foreach collection="array" close=")" open="(" separator="," index="index" item="item">
             #{item}
        </foreach>
    </select>

map传入多参数查询

 List<Alert> getByIds(Map<String, Object> map);

mapper


 <select id="getByIds" parameterType="map" resultMap="situationMap">
 SELECT *
        FROM situation s
        WHERE s.id in
   <foreach index="index" item="item" open="("  separator="," close=")"  collection="ids">
                    #{item}
                </foreach>

调用

注意:此处map 的key 就是 foreach 中 collection 的value
Map<String,Object> map = new HashMap<>();
map.put("ids", ids.toString().split(","));
getByIds(map);

批量插入

dao接口

    void batchCreateRelation(List<CmdbxxxRelation> list);

mapper

<insert id="batchCreateRelation" parameterType="java.util.List">
        INSERT INTO cmdb_xxx_relation(
        source_type,
        source_target,
        dest_type,
        dest_target,
        dest_name,
        relation_type,
        relation_direction)
        VALUES
        <foreach collection="list" item="item" index="index"
                 separator=",">
            (
            #{item.sourceType},
            #{item.sourceTarget},
            #{item.destType},
            #{item.destTarget},
            #{item.destName},
            #{item.relationType},
            #{item.relationDirection}
            )
        </foreach>
    </insert>

批量更新

mybatis 的批量更新 主要依靠 foreach 标签拼接sql 实现批量操作。

第一种方法,拼装成一条sql

<update id="batchUpdateRawEventStatus" parameterType="java.util.List">

update raw_event

set status = 1where id in

<foreach collection="list" item="item" index="index" open="(" close=")" separator=",">

${item.id}

</foreach>

</update>

第二种方法,拼装成多条sql

拼装多条sql 是不支持的,需要在连接数据库的url 上开启多条sql 控制也就是

allowMultiQueries=true

当然JdbcUrl 要开启执行多条sql 是不安全的,小心被sql 注入。

<update id="batchUpdateRawEventStatus" parameterType="java.util.List">

<foreach collection="list" item="item" index="index" open="" close="" separator=";">

update raw_event set status = 1 where id = ${item.id}
 </foreach>

</update>

foreach

foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束.

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值