標籤:style blog http color os io 檔案 2014
有點坑爹,以前沒用過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層注入:
@Repositorypublic 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有什麼特點。唉~~,以後再看看吧。