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

来源:互联网 发布:excel数据误删怎么恢复 编辑:程序博客网 时间:2024/05/22 10:43

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,TransactionIsolationLevellevel)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">INSERTINTO 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">INSERTINTO 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();        }
    这个方法仍然需要包在事务中
原创粉丝点击