mybatis使用的一点小结:session运行模式及批量提交(转)

mybatis的执行器有三种类型:

  • ExecutorType.SIMPLE

这个类型不做特殊的事情,它只为每个语句创建一个PreparedStatement。

  • ExecutorType.REUSE

这种类型将重复使用PreparedStatements。

  • ExecutorType.BATCH

这个类型批量更新,且必要地区别开其中的select 语句,确保动作易于理解。

可以在配置sqlSession时指定相应的类型:

[html] view plain copy

  1. <bean id="fsasSqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  2. <constructor-arg index="0" ref="fsasSqlSessionFactory" />
  3. <constructor-arg index="1" value="SIMPLE" />
  4. </bean>

也可以在通过SqlSessionFactory创建一个SqlSession时指定:

[html] view plain copy

  1. sqlSessionFactory.openSession(ExecutorType.BATCH);

openSession有很多方式:

[html] view plain copy

  1. SqlSession openSession()
  2. SqlSession openSession(boolean autoCommit)
  3. SqlSession openSession(Connection connection)
  4. SqlSession openSession(TransactionIsolationLevel level)
  5. SqlSession openSession(ExecutorType execType,TransactionIsolationLevel
  6. level)
  7. SqlSession openSession(ExecutorType execType)
  8. SqlSession openSession(ExecutorType execType, boolean autoCommit)
  9. SqlSession openSession(ExecutorTyp

默认执行器是SIMPLE。

三种类型执行器除了上面的特点外,在使用过程中还发现:

  • ExecutorType.SIMPLE:可以返回自增键,只需要在mapper文件中,增加属性: useGeneratedKeys="true" keyProperty="productId"

    [html] view plain copy

    1. <!-- 插入一个user -->
    2. <insert id="insertUser" parameterType="User"
    3. statementType="PREPARED" useGeneratedKeys="true" keyProperty="userId">
    4. INSERT
    5. INTO user (
    6. <include refid="userColumns" />
    7. , create_time,
    8. update_time)
    9. VALUES
    10. (#{email}, #{pwd},#{nickname},
    11. #{phone}, #{sign}, #{age},
    12. #{birthday},
    13. #{createTime},
    14. now())
    15. </insert>

    那么自增键会在事务提交后,自动设置到传入的user对象中

  • ExecutorType.BATCH:当前最新版本的mybatis(mybatis-3.2.0)无法再返回自增键值,只返回最后一个更新记录的自增键值(基本上没上意义)。并且无法返回更新数据的记录数
  • 要实现批量插入数据有两种方式:
  1. 使用SIMPLE执行器,借助foreach动态sql语句,使用Insert values(...),(...),(...) 的方式,这种方式无法取到自增键

    比如

    [html] view plain copy

    1. <!-- 批量插入user -->
    2. <insert id="insertUsers" parameterType="map" useGeneratedKeys="true"
    3. keyProperty="userId">
    4. INSERT
    5. INTO user (
    6. <include refid="userColumns" />
    7. , create_time,
    8. update_time)
    9. VALUES
    10. <foreach collection="users" item="userCommand" index="index"
    11. separator=",">
    12. (#{userCommand.email},
    13. #{userCommand.pwd},#{userCommand.nickname},
    14. #{userCommand.phone},
    15. #{userCommand.sign}, #{userCommand.age},
    16. #{userCommand.birthday},
    17. #{userCommand.sex},
    18. #{userCommand.createTime},
    19. now())
    20. </foreach>
    21. </insert>
  2. 使用BATCH执行器,但是SqlSession的执行器类型一旦设置就无法动态修改,所以如果在配置文件中设置了执行器为SIMPLE,当要使用BATCH执行器时,需要临时获取:

    [java] view plain copy

    1. SqlSession session = sqlSessionTemplate.getSqlSessionFactory()
    2. .openSession(ExecutorType.BATCH, false);
    3. try {
    4. UserDao batchUserDao = session.getMapper(UserDao.class);
    5. for (UserCommand user : users) {
    6. batchUserDao.insertUser(user);
    7. }
    8. session.commit();
    9. // 清理缓存,防止溢出
    10. session.clearCache();
    11. // 添加位置信息
    12. userLbsDao.insertUserLbses(users);
    13. } finally {
    14. session.close();
    15. }

    这个方法仍然需要包在事务中

转自:http://blog.csdn.net/meiwen1111/article/details/8260387

时间: 2024-10-04 19:45:37

mybatis使用的一点小结:session运行模式及批量提交(转)的相关文章

PHP的运行模式小结

PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli  命令行运行   (Command Line Interface)4)web模块模式 (apache等web服务器运行的模块模式)1.CGI(Common Gateway Interface)CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把网页和W

赤裸裸的Mybatis之基础应用小结以及IntelliJ IDEA目录结构的一些小问题

IntelliJ IDEA目录结构的一些小问题 [赤裸裸的Mybatis之基础应用小结] 1.不管怎么样,先建立一个简单的MySQL数据表,如下所示 2.接下来要做的事情就是通过Mybatis对数据表进行基础的增删查改,写好bean以及打算实现的方法 import java.util.List; public class PersonDAO { public void savePerson(Person person) { } public void removePersonByName(Str

关于MyBatis sqlSession的一点整理

原文地址:关于MyBatis sqlSession的一点整理 工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些认知和理解,这里简单的总结和整理一下. 首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类: SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例. SqlSes

PHP运行模式的深入理解

PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli  命令行运行   (Command Line Interface)4)web模块模式 (apache等web服务器运行的模块模式)1.CGI(Common Gateway Interface)CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把网页和W

Hive基础之Hive体系架构&amp;运行模式&amp;Hive与关系型数据的区别

Hive架构 1)用户接口: CLI(hive shell):命令行工具:启动方式:hive 或者 hive --service cli ThriftServer:通过Thrift对外提供服务,默认端口是10000:启动方式:hive --service hiveserver WEBUI(浏览器访问hive):通过浏览器访问hive,默认端口是9999:启动方式:hive --service hwi 2)元数据存储(Metastore):启动方式:hive -service metastore

PHP运行模式

PHP运行模式有4钟: 1)cgi 通用网关接口(Common Gateway Interface)) 2) fast-cgi 常驻 (long-live) 型的 CGI 3) cli  命令行运行   (Command Line Interface) 4)web模块模式 (apache等web服务器运行的模块模式) 1.  CGI(Common Gateway Interface) CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一

深入理解PHP的运行模式

PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli  命令行运行   (Command Line Interface)4)web模块模式 (apache等web服务器运行 1.CGI(Common Gateway Interface) CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把网页和WEB服务

php在apache中运行模式

php在apache中运行模式 (2011-12-18 02:38:27) 标签: 杂谈 分类: 服务器及软件 一.php在php在三种工作方式:Apache 模块DLL) 以下分别比较: 1. php在CGI模式.PHP 在 中的 # 对 PHP 4 用这行 Action application/x-httpd-php "/php/php.exe" # 对 PHP 5 用这行 Action application/x-httpd-php "/php/php-Apache 2

MR程序Debug调式或者运行模式

问题描述:在开发MR程序中会遇一些问题需要通过Debug调式,那么本文将介绍描述配置eclipse如何在Windows或者Linux下启动Debug调式. MR程序的Debug调式换言之就是MR程序的运行模式,MR程序有三种运行模式:本地模式(local).集群模式(cluster) Linux环境下: 1.本地模式:直接通过eclipse右键进行Debug即可 2.集群模式: 2.1.将hadoop的配置文件:core-site.xml/hdfs-site.xml/mapreduce-site