首先批量操作的优点是:大大的提高查询的效率。

举个简单的例子:如果在程序中遍历来执行sql的话,这种情况就是有多少行数据就要执行多少条sql,这样导致的效率将是非常低。

如下可能需要40s

insert into USER (name,age) values ('张三','33');
insert into USER (name,age) values ('张三','33');
insert into USER (name,age) values ('张三','33');
insert into USER (name,age) values ('张三','33');
。。。

如果改成批量执行的话,如下可能只需要3s.:

insert into USER (name,age) values
('张三','33'),
('张三','33'),
('张三','33'),
...

下面将进行详细讲解用法。

==============================

批量操作包括批量插入和批量更新和批量删除:

主要是应用<foreach>来实现。

格式如:

<foreach collection="list" item="item" open="(" close=")" separator="," index="index"> #{item.xx}, #{item.xx} </foreach>

其中foreach中的包含的属性值有:

collection="list" 其中list是固定的,如果是数组就是array

item="item" 循环中每一项的别名

open="" 开始标识,比如删除in (id1,id2),open="(" close=")"

close="" 结束标识

separator="," 分隔符号

index="index" 下标值

========================================================================

批量新增:

<!-- 批量保存用户,并返回每个用户插入的ID -->

<insert id="batchSave" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">

INSERT INTO `test`.`tb_user`(`username`, age)

VALUES

<foreach collection="list" item="item" separator=",">

(#{item.username}, #{item.age})

</foreach>

</insert>

扩展:useGeneratedKeys="true" keyProperty="id" 这两个属性的设置表示按主键自增的方式自动生成主键。

如果这种写法在Oracle不兼容的话,可以使用:

INSERT ALL

INTO A(field_1,field_2) VALUES (value_1,value_2)

INTO A(field_1,field_2) VALUES (value_3,value_4)

INTO A(field_1,field_2) VALUES (value_5,value_6)

SELECT 1 FROM DUAL;

详解:

"INSERT ALL INTO  a表
VALUES(各个值)  
INTO a表 VALUES (其它值) 
INTO a表 VALUES(其它值) .... 再跟一个SELECT 语句"。

后边跟的SELECT 语句我们可以从虚拟表里查如 SELECT 1 FROM DUAL。注意后边跟的SELECT语句可以随意,不过不是把它SELECT出来的内容插入前边的表里,而是起到前边的多个数据每次插入多少行的作用,这个多少行是和后边跟的SELECT语句查出来几条而定的,如后边的跟的SELECT 语句查出了15条记录,那么前边的"INSERT ALL INTO  a表 VALUES(各个值1)  INTO a表 VALUES (其它值2) INTO a表 VALUES(其它值3)"就会先插入值1对应的各个字段插入15条记录,然后插入值2各个对应的字段15条记录,然后插入值3对应的各个字段15条记录,也就是说有点按列插入的意思。

我们要的是批量插入多个VALUES这样的一条记录,所以后边的SELECT 语句只要能查出一条记录就行,建议大家后边用SELECT 1 FROM DUAL。

实际项目中的例子有:

<!-- 批量添加添加 -->
<insert id="batchInsert">
INSERT ALL
<foreach collection="list" item="entity" separator="">
into T_JW_XKGL_XKGZXSFW
(
XKGZXSFW_ID,
XKGZ_ID,
XQ_ID,
XYH,
NJ,
ZYDL_ID,
ZY_ID,
ZYFX_ID,
SFXFZ,
SFGAT,
SFLXS,
SFYXS,
SFJHS,
XSQT,
CXB,
CJR,
CJRXM,
CJSJ
)
values (
#{entity.electiveCourseRuleStuScopeID,jdbcType=VARCHAR},
#{entity.electiveCourseRuleID,jdbcType=VARCHAR},
#{entity.campusID,jdbcType=VARCHAR},
#{entity.collegeNum,jdbcType=VARCHAR},
#{entity.grade,jdbcType=VARCHAR},
#{entity.professionBroadID,jdbcType=VARCHAR},
#{entity.professionID,jdbcType=VARCHAR},
#{entity.professionDirID,jdbcType=VARCHAR},
#{entity.creditSystem,jdbcType=VARCHAR},
#{entity.hongKongMacaoTaiwan,jdbcType=VARCHAR},
#{entity.overseasStu,jdbcType=VARCHAR},
#{entity.medicalInsuranceStu,jdbcType=VARCHAR},
#{entity.exchangeStu,jdbcType=VARCHAR},
#{entity.stuGroup,jdbcType=VARCHAR},
#{entity.innovationClazz,jdbcType=VARCHAR},
#{entity.creator,jdbcType=VARCHAR},
#{entity.creatorName,jdbcType=VARCHAR},
#{entity.createTime,jdbcType=TIMESTAMP}
)
</foreach>
SELECT 1 FROM DUAL
</insert>

======================================================

批量删除

<!-- 批量删除用户 -->

<delete id="batchDelete" parameterType="java.util.List">

DELETE FROM USER

WHERE id IN

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

  #{item}

</foreach>

</delete>

================================

第二种批量新增数据的方式:

oracle语法:

insert into tableX
(a,b,c)
select * from (
select 1,2,3 from dual
union
select 4,5,6 from dual
) t

 在使用mybatis时,oracle需要写成下面格式

<foreach collection="list" item="file" index="index" separator="UNION">
实操例子有:
<insert id="batchInsertInfo" parameterType="java.util.List">
insert into XTGL_GGGL_JSFW (GGJSFW_ID, JS_ID, TZGG_ID,
CJR, CJSJ, ZHXGR,
ZHXGSJ)
<foreach close=")" collection="list" item="item" index="index"
open="(" separator="union">
select
#{item.noticeRoseScopeId,jdbcType=VARCHAR}, #{item.roseId,jdbcType=VARCHAR}, #{item.noticeId,jdbcType=VARCHAR},
#{item.creator,jdbcType=VARCHAR},
#{item.createTime,jdbcType=VARCHAR}, #{item.editor,jdbcType=VARCHAR},
#{item.editeTime,jdbcType=VARCHAR}
from dual
</foreach>
</insert>

  

运行通过。在Oracle的版本中,有几点需要注意的:

1.SQL中没有VALUES;

2.<foreach>标签中的(selece ..... from dual);

3.<foreach>标签中的separator的属性为"UNION ALL",将查询合并结果集。

==============================

批量更新

<update id="updateByElectiveCourseResultIds">
update T_JW_XKGL_XKJG
set xkcgbz=#{dto.successFlag,jdbcType=VARCHAR},
ZHXGR =#{dto.editor,jdbcType=VARCHAR},
ZHXGRXM =#{dto.editorName,jdbcType=VARCHAR},
ZHXGSJ =#{dto.editeTime,jdbcType=DATE}
where xkjg_id in
<foreach collection="dto.electiveCourseResultIds" index="index" item="item"
open="(" separator="," close=")">
  #{item}
</foreach>
</update>

=======================

实现代码:从网上摘得一个例子(服务层得实现类下)

public void batchAddDevice(int sceneId, String list) {
List<SceneDevice> sceneDevicesList = new ArrayList<>();
Map deviceMap = new HashMap<>();
Gson gson = new Gson();
JSONArray jsonArray = JSONArray.fromObject(list);
for(int i = 0;i < jsonArray.size(); i++){
SceneDevice sceneDevice = new SceneDevice();
String jsonString = jsonArray.getString(i);
deviceMap = gson.fromJson(jsonString, deviceMap.getClass());
sceneDevice.setId(Integer.parseInt(deviceMap.get("id").toString()));
sceneDevice.setSceneId(sceneId);
sceneDevice.setDeviceId(Integer.parseInt(deviceMap.get("deviceId").toString()));
sceneDevice.setPattern(deviceMap.get("pattern").toString());
sceneDevicesList.add(sceneDevice);
}
curdRepo.batchAddDevice(sceneDevicesList);
}
其中crudRepo接口声明得方法是:
public void  batchAddDevice(@Param("list") List<SceneDevice> list);
解释:
@Param("list")表示传到Mapper中得集合名字叫做list
=======================================================================
注意:批量新增不能通过dblinke进行DDL操作,不然会报错

												

Mybatis之批量操作的更多相关文章

  1. Mybatis Batch 批量操作

    Mybatis Batch 批量操作 http://www.blogjava.net/diggbag/articles/mybatis.html

  2. 解决使用mybatis做批量操作时发生的异常:Parameter '__frch_item_0' not found. Available parameters are [list] 记录

    本文主要描述 使用mybatis进行批量更新.批量插入 过程中遇到的异常及总结: 首先贴出使用批量操作报的异常信息: java.lang.RuntimeException: org.mybatis.s ...

  3. [转]Mybatis foreach 批量操作

    原文地址:https://blog.csdn.net/jason5186/article/details/40896043 foreach属性属性    描述item    循环体中的具体对象.支持属 ...

  4. mybatis的批量操作

    foreach关键字: 批量查找/删除:用where id in<foreach> (xxx,yyy,zzz ...)</foreach> 批量更新:需要开启批量sql,比如d ...

  5. 【java】【mybatis】在使用mybatis进行批量插入,批量更新等批量操作时,切割In集合List进行分批批量操作的java中的切割代码

    红字部分代表mybatis的批量操作调用方法: int num = 0; int maxLength = 200; int size = usableCodes.size(); if (size &l ...

  6. mybatis增强

    MyBatis SQL参数传递(掌握) SQL映射器Mapper接口(掌握)Myb atis批量操作(理解掌握) (多对一)关联映射(掌握) (一对多,多对多)集合映射 MyBatis原理回顾(Obj ...

  7. mybatis 中 使用 allowMultiQueries=true

    单条的数据进行修改或者插入的时候没问题,但是进行批量操作的时候就会出现错误,是因为没有开启支持批量操作的功能. mybatis支持批量操作 开启批量执行sql的开关,在拼装mysql链接的url时,为 ...

  8. MyBatis批量增删改的另外一种思路(推荐)

    零.传统拼接SQL语句的弊端 传统上利用Mybatis进行批量操作的方式本质来说是拼接SQL语句,然后交给底层执行,如之前博文而言. 其实这种方式是存在弊端的: 1. SQL语句可能会过长,DB的引擎 ...

  9. mybatis第二天02

    MyBatis第二天内容 1.mybatis的执行原理 通过: 1.全局配置文件SqlMapConfig.xml  映射文件mapper.xml 获取得到SqlSessinFactory工厂 2.由工 ...

随机推荐

  1. elasticsearch 5.0以上不支持consistency 和 quorum

    从ES2.2升级到5.2后,原先执行put 带 consistency=all / quorum 参数的,都报错了,提示语法错误.. 百度查了一通,都没发现相关问题.无奈,还是查官方文档.. 发现这是 ...

  2. [数据库]Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员”

    在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...

  3. jupyter可视化调试

    1. 安装PixieDust  pip install pixiedust 2. %%pixie_debugger <The Visual Python Debugger for Jupyter ...

  4. js obj对象转formdata格式代码

    import isArray from "lodash/isArray" export function objToFormData(config) { //对象转formdata ...

  5. LayaAir疑难杂症之二:字符输入限制不生效(多个限制条件该如何赋值给restrict)

      问题描述 采用LayaAir进行开发,在使用TextInput时,对restrict属性进行赋值,使该输入框只允许输入中英文.数字,restrict = “[\u4E00-\u9FA5A-Za-z ...

  6. mosquitto broker 安装服务后启动失败

    一.失败原因 由于做项目用到Mqtt协议,需要安装mosquitto broker 服务,在自己本地笔记本电脑安装后直接启动服务是可以的.后来部署到服务器启动,报错缺少msvcr100.dll ,由于 ...

  7. loadrunner-关联

    1.什么是关联? 将服务器动态返回的值,保存成一个参数,供后面需要使用到 此参数的地方使用 PS:1.一定是服务器返回的 2.动态变化的,静态不需要关联 3.服务器需要校验的 4.保存成一个参数 5. ...

  8. python各种web框架对比

    0 引言        python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的 ...

  9. [CSS3]环形进度条

    来源:https://codepen.io/eZ0/pen/eZXNzd 点击上面链接有源码有示例. .ko-progress-circle { width: 120px; height: 120px ...

  10. 一千行 MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...