MyBatis的Dao層注入SqlSession


  有點坑爹,以前沒用過Mybatis,最近才用,而且一直用Mybatis推薦的接口映射的方式,但是今天有人告訴我接口方式用得少,大多還是采用從配置文件里面讀sql的方式,當然接口也是類似的,都是利用mapper.xml。

  於是就想把這東西整合進來,當進行dao的時候發現一個小問題,sqlSession怎么注入進來的問題,以前Hibernate的的習慣用sessionFactory的openSession()方法,但是每個方法都要open一下,麻煩,就想能不能直接把sqlSession通過注解注入進來,有下面這三個類都實現了這個接口:

  

我估計這三個類都差不多,個人估計是功能呢和支持上或者線程同步上面的差別,應該都能生成一個SqlSession實例讓我在dao層中運用,打開DefaultSqlSession這個類,里面的幾個屬性沒看懂,於是放棄這個類了;在打開SqlSessionManager這個類,發現構造方法都跟輸入流有點關系,我懷疑是根據配置文件之類的方式來實例化,又放棄了;在打開SqlSessionTemplate這個類,發現構造方法只和sqlSessionFactory有關系,感覺有點像了,因為容器里面本來就有sqlSessionFactory,所以可以直接實例化,他的構造方法:

  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
  }

於是在spring配置文件中加入下面配置,通過構造方法來實例化。

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
        <constructor-arg index="0" ref="sqlSessionFactory"/>  
    </bean>

然后在dao層注入:

@Repository
public class ArticleDaoImpl implements ArticleDao {

    @Resource
    private SqlSession sqlSession;
}

隨便找了個類測了下通過了,說明這樣做是可行的,然后上網查了下看別人是怎么做的,有人說到dao繼承SqlSessionDaoSupport這個類,這個類里面包含了有sqlSession,於是看了下這個類的源碼,發現這個類里面的sqlSession其實就是SqlSessionTemplate類的實力,跟上面一樣的,

  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    if (!this.externalSqlSession) {
      this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
    }
  }

  public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
    this.sqlSession = sqlSessionTemplate;
    this.externalSqlSession = true;
  }

也就沒去研究這個類到底有什么用,我個人是有個不好的癖好,除非萬不得已我不太喜歡去繼承某個類,感覺一旦繼承了就加入了耦合,有這么個毛病,所以就這樣子了,不知道SqlSession的其他兩個實現有什么特點,也不清楚網上說繼承這個SqlSessionDaoSupport有什么特點。唉~~,以后再看看吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM