session运行模式、批量提交

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
在创建session 时我们有很多的选择比如 是否自动提交,事务的级别,执行方式等这些我们都可以指定,但默认执行器是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)无法再返回自增键值,只返回最后一个更新记录的自增键值(基本上没上意义)。并且无法返回更新数据的记录数
  • 要实现批量插入数据有两种方式:
  1. 使用SIMPLE执行器,借助foreach动态sql语句,使用Insert values(...),(...),(...) 的方式,这种方式无法取到自增键
    比如
  2. <!-- 批量插入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执行器时,需要临时获取,也就是你设定的执行方式这个session中都是一样的,除非你新建一个session。
  3.  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();
            }

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


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值