有點坑爹,以前沒用過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有什么特點。唉~~,以后再看看吧。
