zoukankan      html  css  js  c++  java
  • mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题

    我们公司的项目使用spring+mybatis组合。

    所以就必须得使用mybatis-spring了。

    所以此处就昨日mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题,做了一个总结。

    我们能够先来看看mybatis-spring框架的1.1.1版本号中关于SqlSessionDaoSupport的代码吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    package org.mybatis.spring.support;
     
    import static org.springframework.util.Assert.*;
     
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.dao.support.DaoSupport;
     
    /**
     * Convenient super class for MyBatis SqlSession data access objects.
     * It gives you access to the template which can then be used to execute SQL methods.
     * <p>
     * This class needs a SqlSessionTemplate or a SqlSessionFactory.
     * If both are set the SqlSessionFactory will be ignored.
     *
     * @see #setSqlSessionFactory
     * @see #setSqlSessionTemplate
     * @see SqlSessionTemplate
     * @version $Id: SqlSessionDaoSupport.java 4885 2012-03-12 09:58:54Z simone.tripodi $
     */
    public abstract class SqlSessionDaoSupport extends DaoSupport {
     
      private SqlSession sqlSession;
     
      private boolean externalSqlSession;
     
      @Autowired(required = false)
      public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        if (!this.externalSqlSession) {
          this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
        }
      }
     
      @Autowired(required = false)
      public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSession = sqlSessionTemplate;
        this.externalSqlSession = true;
      }
     
      /**
       * Users should use this method to get a SqlSession to call its statement methods
       * This is SqlSession is managed by spring. Users should not commit/rollback/close it
       * because it will be automatically done.
       *
       * @return Spring managed thread safe SqlSession
       */
      public final SqlSession getSqlSession() {
        return this.sqlSession;
      }
     
      /**
       * {@inheritDoc}
       */
      protected void checkDaoConfig() {
        notNull(this.sqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required");
      }
     
    }

      从上面的源代码能够看出:在方法setSqlSessionFactory和setSqlSessionTemplate方法上面都标注有:“@Autowired(required = false)”这种注解。

    所以我们在编写dao层级代码的时候仅仅须要dao直接继承SqlSessionDaoSupport。并标注注解@Repository,然后就能够使用类似的getSqlSession().selectList("User.selectUsers");这个方案来使用它了。并且在spring的配置文件里的配置也比較少:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <tx:annotation-driven transaction-manager="txManager"
                             proxy-target-class="true"/>
     
       <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
           <property name="dataSource" ref="dataSource"/>
       </bean>
     
       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
           <property name="dataSource" ref="dataSource"/>
           <property name="configLocation" value="classpath:mybatis-config.xml"/>
       </bean>

      

      可是升级到1.2之后,我们看看SqlSessionDaoSupport的源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public abstract class SqlSessionDaoSupport extends DaoSupport {
     
      private SqlSession sqlSession;
     
      private boolean externalSqlSession;
     
      public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        if (!this.externalSqlSession) {
          this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
        }
      }
     
      public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSession = sqlSessionTemplate;
        this.externalSqlSession = true;
      }
     
      /**
       * Users should use this method to get a SqlSession to call its statement methods
       * This is SqlSession is managed by spring. Users should not commit/rollback/close it
       * because it will be automatically done.
       *
       * @return Spring managed thread safe SqlSession
       */
      public SqlSession getSqlSession() {
        return this.sqlSession;
      }
     
      /**
       * {@inheritDoc}
       */
      protected void checkDaoConfig() {
        notNull(this.sqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required");
      }
     
    }

      

      从上面的源代码能够看出:在方法setSqlSessionFactory和setSqlSessionTemplate方法上面如今都没有标注有:“@Autowired(required = false)”这种注解。

    假设一些系统直接从mybatis-spring1.1.1升级到1.2版本号的时候,就会出现故障。

    在1.2版本号以下有几种方式来使用:

    第一种,基于注解:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Repository
    public class UserDao extends SqlSessionDaoSupport{
        public List<User> userList() {
            return getSqlSession().selectList("User.selectUsers");
        }
     
        @Override
        @Autowired
        public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
            super.setSqlSessionFactory(sqlSessionFactory);
        }
    }

      

      我们自己重写set方法就能够了。

    在这样的情况下spring的配置文件不须要改动。这个实例是任意写的,假设你的project中dao类非常多(绝大多数情况都是),这样你就能够编写一个BaseDao,然后在这个BaseDao中重写这种方法,其它的dao仅仅须要继承这个BaseDao就能够了。

    第二章基于xml文件配置:

    1
    2
    3
    4
    5
    public class UserDao extends SqlSessionDaoSupport {
        public List<User> userList() {
            return getSqlSession().selectList("User.selectUsers");
        }
    }

      

      可是须要在spring的配置文件里添加这个UserDao的配置:

    1
    2
    3
    <bean id="userDao" class="com.xxx.paginator.dao.UserDao">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

      

      第一种基于注解的配置,优点是不须要编写xml,可是这样的比較easy侵入业务逻辑。

         另外一种基于xml配置。优点是不侵入业务逻辑,可是当dao的数量非常多的时候,须要在xml中配置好多。

         所以最后详细选择哪种,大家能够结合自己的情况。

  • 相关阅读:
    uni-app中的数值监控方式及函数的封装和引用方式
    uni-app引入阿里矢量图在移动端不显示的问题
    前端登录页点击获取验证码的实现
    app每次更新版本时调用js代码提示用户下载更新
    @Dependson注解与@ConditionalOnBean注解的区别
    navicat for mysql 12中文破解版(安装+破解)--亲测可用
    Kubernetes 常用命令
    MySQL MERGE存储引擎
    MySQL中MyISAM与InnoDB区别
    什么是事务?什么是事务日志以及用途?
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6889249.html
Copyright © 2011-2022 走看看