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)无法再返回自增键值,只返回最后一个更新记录的自增键值(基本上没上意义)。并且无法返回更新数据的记录数
  • 要实现批量插入数据有两种方式:
  1. 使用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>
  2. 使用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();
            }
    这个方法仍然需要包在事务中
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值