mybatis使用的一点小结:session运行模式及批量提交(转)
mybatis的执行器有三种类型:
- ExecutorType.SIMPLE
这个类型不做特殊的事情,它只为每个语句创建一个PreparedStatement。
- ExecutorType.REUSE
这种类型将重复使用PreparedStatements。
- ExecutorType.BATCH
这个类型批量更新,且必要地区别开其中的select 语句,确保动作易于理解。
可以在配置sqlSession时指定相应的类型:
- <bean id="fsasSqlSession" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="fsasSqlSessionFactory" />
- <constructor-arg index="1" value="SIMPLE" />
- </bean>
也可以在通过SqlSessionFactory创建一个SqlSession时指定:
- sqlSessionFactory.openSession(ExecutorType.BATCH);
openSession有很多方式:
- SqlSession openSession()
- SqlSession openSession(boolean autoCommit)
- SqlSession openSession(Connection connection)
- SqlSession openSession(TransactionIsolationLevel level)
- SqlSession openSession(ExecutorType execType,TransactionIsolationLevel
- level)
- SqlSession openSession(ExecutorType execType)
- SqlSession openSession(ExecutorType execType, boolean autoCommit)
- SqlSession openSession(ExecutorTyp
默认执行器是SIMPLE。
三种类型执行器除了上面的特点外,在使用过程中还发现:
- ExecutorType.SIMPLE:可以返回自增键,只需要在mapper文件中,增加属性: useGeneratedKeys="true" keyProperty="productId"
- <!-- 插入一个user -->
- <insert id="insertUser" parameterType="User"
- statementType="PREPARED" useGeneratedKeys="true" keyProperty="userId">
- INSERT
- INTO user (
- <include refid="userColumns" />
- , create_time,
- update_time)
- VALUES
- (#{email}, #{pwd},#{nickname},
- #{phone}, #{sign}, #{age},
- #{birthday},
- #{createTime},
- now())
- </insert>
那么自增键会在事务提交后,自动设置到传入的user对象中
- ExecutorType.BATCH:当前最新版本的mybatis(mybatis-3.2.0)无法再返回自增键值,只返回最后一个更新记录的自增键值(基本上没上意义)。并且无法返回更新数据的记录数
- 要实现批量插入数据有两种方式:
- 使用SIMPLE执行器,借助foreach动态sql语句,使用Insert values(...),(...),(...) 的方式,这种方式无法取到自增键
比如
- <!-- 批量插入user -->
- <insert id="insertUsers" parameterType="map" useGeneratedKeys="true"
- keyProperty="userId">
- INSERT
- INTO user (
- <include refid="userColumns" />
- , create_time,
- update_time)
- VALUES
- <foreach collection="users" item="userCommand" index="index"
- separator=",">
- (#{userCommand.email},
- #{userCommand.pwd},#{userCommand.nickname},
- #{userCommand.phone},
- #{userCommand.sign}, #{userCommand.age},
- #{userCommand.birthday},
- #{userCommand.sex},
- #{userCommand.createTime},
- now())
- </foreach>
- </insert>
- 使用BATCH执行器,但是SqlSession的执行器类型一旦设置就无法动态修改,所以如果在配置文件中设置了执行器为SIMPLE,当要使用BATCH执行器时,需要临时获取:
- SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
- .openSession(ExecutorType.BATCH, false);
- try {
- UserDao batchUserDao = session.getMapper(UserDao.class);
- for (UserCommand user : users) {
- batchUserDao.insertUser(user);
- }
- session.commit();
- // 清理缓存,防止溢出
- session.clearCache();
- // 添加位置信息
- userLbsDao.insertUserLbses(users);
- } finally {
- session.close();
- }
这个方法仍然需要包在事务中
mybatis使用的一点小结:session运行模式及批量提交(转)的更多相关文章
- Spark学习之路(五)—— Spark运行模式与作业提交
一.作业提交 1.1 spark-submit Spark所有模式均使用spark-submit命令提交作业,其格式如下: ./bin/spark-submit \ --class <main- ...
- Spark 系列(五)—— Spark 运行模式与作业提交
一.作业提交 1.1 spark-submit Spark 所有模式均使用 spark-submit 命令提交作业,其格式如下: ./bin/spark-submit \ --class <ma ...
- Mybatis之基础应用小结以及IntelliJ IDEA目录结构的一些小问题
IntelliJ IDEA 目录结构的一些小问题 [Mybatis 之基础应用小结] 1.不管怎么样,先建立一个简单的MySQL数据表,如下所示 2.接下来要做的事情就是通过Mybatis对数据表进行 ...
- Apache Flink on K8s:四种运行模式,我该选择哪种?
1. 前言 Apache Flink 是一个分布式流处理引擎,它提供了丰富且易用的API来处理有状态的流处理应用,并且在支持容错的前提下,高效.大规模的运行此类应用.通过支持事件时间(event-ti ...
- PHP运行模式
1.运行模式 关于PHP目前比较常见的五大运行模式: 1)CGI(通用网关接口 / Common Gateway Interface) 2)FastCGI(常驻型CGI / Long-Live CGI ...
- php运行模式的比较(转)
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...
- 【转载】PHP运行模式的深入理解
PHP运行模式的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-03我要评论 本篇文章是对PHP运行模式进行了详细的分析介绍,需要的朋友参考下 PHP运行模式有4钟:1) ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 【转】
转自:http://blog.chinaunix.net/uid-28458801-id-3494646.html ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常 ...
- PHP运行模式的深入理解
PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli 命令行运行 ( ...
随机推荐
- [Linux系统] (3)应用安装方式详解(编译安装、rpm包安装、yum安装)
软件的安装方式: 编译安装 RPM包安装 yum安装 一.编译安装 1.下载一个源码安装包:tengine-2.3.0.tar.gz.这是淘宝二次开发过的nginx.将其解压. .tar.gz 2.查 ...
- Postman(一)、断言
postman常见断言方法介绍: 1.Clear a global variable (清除一个全局变量) postman.clearGlobalVariable("variable_ke ...
- php 将几个变量合为数组,变量名和值对应
<?php $firstname = "Bill"; $lastname = "Gates"; $age = "60"; $resul ...
- zabbix服务端连接客户端报错Received empty response from Zabbix Agent at [192.168.10.105]. Assuming that agent dropped connection because of access permissions
这是zabbix WEB报的问题:Received empty response from Zabbix Agent at [192.168.10.105]. Assuming that agent ...
- 20道HTML基础面试题(附答案)
以下是我整理的一些HTML的基础面试体,并自己整理了答案. 1 DOCTYPE有什么作用?标准模式与混杂模式如何区分?它们有何意义? 告诉浏览器使用哪个版本的HTML规范来渲染文档.DOCTYPE不存 ...
- mysql 查询一个月的数据
//今天 select * from 表名 where to_days(时间字段名) = to_days(now()); //昨天 SELECT * FROM 表名 WHERE TO_DAYS( NO ...
- C++入门经典-例3.9-使用嵌套表达式判断一个数是否是3和5的整数倍
1:代码如下: // 3.9.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...
- 2019年6月Github最新开源java项目
目录 1.halo,这是一个轻快,简洁,功能强大,使用Java开发的博客系统. 2.jeecg-boot 3.CS-Notes 4.JavaGuide 5.advanced-java 6.mall-l ...
- Docker安装Zookeeper并进行操作
Docker安装Zookeeper 下载Zookeeper镜像docker pull zookeeper1启动容器并添加映射docker run --privileged=true -d --name ...
- 【数据算法】Java实现二叉树存储以及遍历
二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过Linke ...