mybatis-spring-1.0.0官方中…

本文分享了在整合MyBatis 3.0.6与Spring 3.1.0过程中遇到的问题及解决方法,特别关注SqlSessionTemplate的正确配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天在整合mybatis3.0.6与spring3.1.0的时候,总是报错,一天的时间一大半就浪费在上面了,在此总结教训:切勿百分百相信官方文档,特别是中文文档(不知中文文档是不是国内的翻译的),源码结合英文文档才是王道。我这次使用的spring与mybatis都是官方出的最新版本,网上案例很少,希望下面的总结能给后面使用这两个版本的提供小小借鉴。
 
        mybatis3在spring3后面发布,故spring本身不提供工具整合mybatis3。mybatis开发团队自己开发了插件mybatis-spring,以达到整合spring的目的。mybatis开发团队非常不错,不仅提供了mybatis3文档(PDF),还提供了mybatis-spring的文档,中英文版都有。
我最开始下的是mybatis-spring-1.0.0(由于当时没展开所有下载,只看到1.0.0,以为是最新),在整合过程中,我参考mybatis-spring-1.0.0-RC2-reference.pdf文档。配置SqlSession的过程中,我采用前几种方法都通过了测试。后面看到有SqlSessionTemplate,因为它是线程安全类,且能很好处理批量操作,后改为SqlSessionTemplate来注入SqlSession进行测试。
 
文档是提到:SqlSessionTemplate实现了SqlSession接口,下面是文档上的配置
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="sqlSessionFactory" />
      <constructor-arg index="1" value="BATCH" />
</bean>
 
下面是我实现类的配置:
 

public class UserDaoImpl implements UserDao {
 
  private SqlSession portalSqlSession;
 
  //根据ID查询
  public User selectUserById(User user) {
    System.out.println("---------------" + user.getUserId());
    user = (User) portalSqlSession.selectOne("com.ailk.bi.service.UserService.selectUserById", user);
    return user;
  }
...........
}
 
其他配置也没问题,但启动容器后报两个错,一是注入的portalSqlSession不能转换为SqlSession类型,二是提示<constructor-arg index="1" value="BATCH" />这个有问题,应该是没这个构造参数。
我反复检查了代码,并阅读了官方文档三遍以上,还是觉得没错。文档上提到SqlSessionTemplate实现了SqlSession接口,那么我注入的SqlSessionTemplate是SqlSession实现类,不会有转换类型错误。但这个错误足足浪费了我下午三个小时   ,百思不得其解。
下班后回到住所,仔细想了想,是不是SqlSessionTemplate不是SqlSession子类,我用反编译工具将mybatis-spring-1.0.0.jar包打开,一看源代码,我猜对。
 
部分源码码如下:
public class SqlSessionTemplate extends JdbcAccessor  implements SqlSessionOperations
{
  private SqlSessionFactory sqlSessionFactory;
  public SqlSessionTemplate()
  {
  }
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
  {
      setSqlSessionFactory(sqlSessionFactory);
      afterPropertiesSet();
  }
......
}
 
JdbcAccessor不是SqlSession子类  ,SqlSessionOperations接口不是SqlSession接口。所以SqlSessionTemplate没有实现SqlSession。跟文档描述的不符。同时,构造参数也只有sqlSessionFactory一个参数,没有第二个参数,因些<constructor-arg index="1" value="BATCH" />也是错误的。
 
根据这些,我把private SqlSession portalSqlSession; 换成private SqlSessionTemplate portalSqlSession;并把<constructor-arg index="1" value="BATCH" />配置注释掉,容器启动通过,程序测试通过!  
 
程序测试通过后,我还是想用上批量SqlSession,既然文档有写,那肯定有这功能,是不是有新版本实现了呢。我去官方去找(现在mybatis资源都放在googlecode上),便找到了mybatis-spring-1.0.2版本,此版本只有英文文档。反编译mybatis-spring-1.0.2原码,我直奔SqlSessionTemplate,发现SqlSessionTemplate不一样了。如下:
 
public class SqlSessionTemplate implements SqlSession
{
  private final SqlSessionFactory sqlSessionFactory;
  private final ExecutorType executorType;
  private final SqlSession sqlSessionProxy;
  private final PersistenceExceptionTran slator exceptionTranslator;
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
  {
      this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
  }
  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType)
  {
      this(sqlSessionFactory, executorType, new MyBatisExceptionTranslat or(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true));
  }
  ......
}
 
SqlSessionTemplate实现了SqlSession接口,同时也有两个构造参数。马上恢复今天下午的代码,替换mybatis-spring-1.0.2.jar,程序顺利测试通过(长叹了一口气)  
 
尔后,我又翻阅了1.0.0英文文档,发现1.0.0中文文档不相符,后查阅了1.0.2文档,发现1.0.2英文文档与1.0.0中文档吻合,估计是翻译的那位仁兄把版本弄错了。
 
如果要使用mybatis3与spring,建议使用mybatis-spring-1.0.2,此版本功能更强大,1.1.0应该还在开发中,官网只有mybatis-spring-1.1.0-SNAPSHOT.jar,里面只有源码。
 
下面附上mybatis3与spring3整合配置文档的主要部分,供挨踢友参考:
 
  <bean id="portalDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
      <property name="jdbcUrl" value="jdbc:oracle:thin:@10.156.76.69:1521:testbi" />
      <property name="user" value="UCR_PORTAL" />
      <property name="password" value="ngbas_db96" />
      <property name="autoCommitOnClose" value="true"/>
      <property name="checkoutTimeout" value="5000"/>
      <property name="initialPoolSize" value="20"/>
      <property name="minPoolSize" value="20"/>
      <property name="maxPoolSize" value="50"/>
      <property name="maxIdleTime" value="7200"/>
      <property name="acquireIncrement" value="1800"/>
      <property name="maxIdleTimeExcessConnect ions" value="10"/>
  </bean>

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionMan ager">
      <property name="dataSource" ref="portalDataSource"/>
  </bean>

  <bean id="portalSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="configLocation" value="classpath:ibatis/mybatis-config.xml"/>
      <property name="dataSource" ref="portalDataSource"/>
  </bean>
 
  <bean id="portalSqlSession" class="org.mybatis.spring.SqlSessionTemplate">
      <constructor-arg index="0" ref="portalSqlSessionFactory" />
      <constructor-arg index="1" value="BATCH" />
  </bean>
 
  <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryB ean" abstract="true">
      <property name="transactionManager" ref="transactionManager" />
      <property name="transactionAttributes">
            <props>
                    <prop key="add*">PROPAGATION_REQUIRED</prop>
                    <prop key="edit*">PROPAGATION_REQUIRED</prop>
                    <prop key="remove*">PROPAGATION_REQUIRED</prop>
                    <prop key="insert*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="del*">PROPAGATION_REQUIRED</prop>
                    <prop key="*">readOnly</prop>
              </props>
      </property>
  </bean>
 
还是要感谢mybatis团队,不仅提供了优雅的持久层开源框架,还及时在官网上提供中文文档(虽然中文文档版本上出了点小纰漏),工作态度值得钦佩与学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值