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
相关文章推荐
- spring springmvc mybatis 整合批量操作,批量更新,批量插入
- Mybatis操作(批量插入,批量修改,批量删除, 分页查询)
- mybatis 操作(批量插入,批量修改,批量删除, 分页查询)
- DedeCms二次开发之简单的查询、插入、更新、删除操作实例
- ThinkPHP 数据库操作,插入,更新,删除,查询
- Hibernate批处理操作优化 (批量插入、更新与删除)
- Android Sqlite数据库执行插入查询更新删除的操作对比
- MyBatis直接执行SQL查询及批量插入数据
- 用 JdbcTemplate 进行批量插入或更新操作
- maven+mybatis+mybatis-generator+sql server 2005自动生成代码,加上自定义分页插件和批量插入更新插件
- Hibernate批处理操作优化 (批量插入、更新与删除)
- Spring JdbcTemplate 批量插入或更新操作
- sql 批量操作(存在的更新,不存在的插入)
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- Python操作MySQL数据库--插入、更新、查询(二)
- sqlite3的基本操作(插入,删除,更新,查询)
- Android Sqlite数据库执行插入查询更新删除的操作对比
- MyBatis直接执行SQL查询及批量插入数据
- Hibernate批处理操作优化 (批量插入、更新与删除)
- Hibernate批处理操作优化 (批量插入、更新与删除)