您的位置:首页 > 数据库

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

2017-02-14 00:09 519 查看

批量查询

传入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 = 1

where 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis sql