mybatis的执行器有三种类型:
这个类型不做特殊的事情,它只为每个语句创建一个PreparedStatement。
这种类型将重复使用PreparedStatements。
这个类型批量更新,且必要地区别开其中的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"
- <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(...),(...),(...) 的方式,这种方式无法取到自增键
比如
- <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();
- }
这个方法仍然需要包在事务中