mybatis在spring-boot中的默认sql执行器executor-type的修改

1.executor-type介绍

mybatis提供三种sql执行器,分别是SIMPLE、REUSE、BATCH。

  • SIMPLE是默认执行器,根据对应的sql直接执行,不会做一些额外的操作。
  • REUSE是可重用执行器,重用对象是Statement(即该执行器会缓存同一个sql的Statement,省去Statement的重新创建,优化性能)(即会重用预处理语句)
  • BATCH执行器会重用预处理语句,并执行批量更新。

即executor-type有三种值,即SIMPLE、REUSE、BATCH。

2.executor-type执行效果

  • executor-type值为SIMPLE、REUSE,可通过insert、update、delete方法的返回值判断sql是否执行成功,返回非0表示执行sql成功的条数,返回0表示sql执行失败
  • executor-type值为BATCH,insert、update、delete方法返回值一直会是负数-2147482646,在该模式下insert、update、delete返回值将无任何意义,不能作为判断sql执行成功的判断依据

3.executor-type在spring-boot框架下的修改

修改executory-type,需要手动配置SqlSessionTemplate。

注:SqlSessionTemplate介绍
mybatis在spring-boot中的默认sql执行器executor-type的修改
SqlSession: 数据库CRUD及事务操作接口,线程不安全,常用于Request范围或method范围
SqlSessionFactory :创建SqlSession的工厂类
SqlSessionManager/SqlSessionTemplate[装饰器模式] :SqlSession装饰器,增强SqlSession生命周期管理
综上所述,SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;SqlSessionFactory是一种生产SqlSession的工厂;SqlSession(接口)是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的一个具体实现。

1)在spring的application.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd">     
            
       <!-- Properties文件读取配置,base的properties -->  
       <context:property-placeholder location="classpath:jdbc.properties"/>   
       
       <!-- JNDI获取数据源(使用dbcp连接池) -->    
       <!-- 因为我们使用的这个数据源是采用 dbcp连接池,对于连接池来说,整个应用中只有一个,
            所以作用域需要设置成单例 因为获取数据源是非常消耗性能,所以我们也要采用单例模式-->
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
      scope="singleton">
           <property name="driverClassName" value="${driverClassName}" />  
           <property name="url" value="${url}" />  
           <property name="username" value="${username}" />  
           <property name="password" value="${password}" />  
      </bean>       
       <!-- 事务配置  在需要事务管理的地方加@Transactional 注解或者AOP进行事务处理-->
       <bean id="transactionManager" 
         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
       </bean>        
       <!-- 配置mybitas SqlSessionFactoryBean  -->
       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
           <property name="dataSource" ref="dataSource" />  
           <property name="configLocation" value="classpath:mybatis-config.xml" />  
           <property name="mapperLocations" value="classpath:com/zhl/dao/*.xml"/> 
       </bean> 
       <!--配置一个可以进行批量执行的sqlSession  -->
		<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"></constructor-arg>
		    <constructor-arg name="executorType" value="BATCH"></constructor-arg>
		</bean>
        <!-- 把sqlSessionTemplate注入测试类 -->
        <bean id="userDao" class="com.zhl.dao.UserDao">
            <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>  
        </bean>
</beans>

2)通过注解方式修改
本人的工程使用注解完成mybatis的相关配置,现就使用注解如何修改做一下记录。

/**
 *  数据源配置类
 */
 @Configuration
 @MapperScan(basePackages={"com.zhl.dao.**.dao"},sqlSessionFactoryRef="sqlSessionFactory-dataSource")
 public class DataSourceConfig{
 	@Primary
 	@Bean(name={"sqlSessionFactory-dynamic"})
 	public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamic")DataSource dataSource){
 		GlobalConfig gcfg = new GloablConfig();
 		gcfg.setDbConfig(new  DbConfig().setDbType(DbType.ORACLE));
 		MybatisConfiguration mcfg = new MybatisConfiguration();
 		mcfg.setJdbcTypeForNull(jdbcType.NULL);
 		final MybatisSqlSessionFactoryBean msfb = new MybatisSqlSessionFactoryBean();
 		msfb.setDataSource(dataSource);
 		//msfb.setPlugins(new intercptor[]{new MyPaginationInterceptor(),new MySqlPrintInterceptor});
 		msfb.setGlobalConfig(gcfg);
 		msfb.setConfiguration(mcfg);
 		return msfb.getObject();
 	}
	@Bean("batchSqlSessionTemplate")
	public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("sqlSessionFactory-dataSource")SqlSessionFactory sqlSessionFactory){
		return new SqlSessionTemplate(sqlSessionFactory,ExecutoryType.BATCH);
	}
 }