在MyBatis中,你可以使用SqlSessionFactory來建立SqlSession。
一旦你獲得一個session之後,你可以使用它來執行映射語句,送出或復原連接配接,
最後,當不再需要它的時候, 你可以關閉 session。
使用MyBatis-Spring之後, 你不再需要直接使用SqlSessionFactory了,
因為你的bean可以通過一個線程安全的SqlSession來注入,基于Spring的事務配置來自動送出,復原,關閉 session。
SqlSessionTemplate
SqlSessionTemplate是MyBatis-Spring的核心。這個類負責管理MyBatis的SqlSession,調用MyBatis的SQL方法,翻譯異常。
SqlSessionTemplate是線程安全的,可以被多個DAO所共享使用。
當調用SQL方法時,包含從映射器getMapper()方法傳回的方法,SqlSessionTemplate将會保證使用的SqlSession是和目前Spring的事務相關的。
此外,它管理session的生命周期,包含必要的關閉,送出或復原操作。
SqlSessionTemplate實作了SqlSession接口,這就是說,在代碼中無需對MyBatis的SqlSession進行替換。
SqlSessionTemplate通常是被用來替代預設的MyBatis實作的DefaultSqlSession,因為模闆可以參與到Spring的事務中并且被多個注入的映射器類所使用時也是線程安全的。
相同應用程式中兩個類之間的轉換可能會引起資料一緻性的問題。
SqlSessionTemplate對象可以使用SqlSessionFactory作為構造方法的參數來建立。
<beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">
<constructor-argindex="0"ref="sqlSessionFactory"/>
</bean>
這個bean現在可以直接注入到DAObean中。你需要在bean中添加一個SqlSession屬性,就像下面的代碼:
publicclassUserDaoImplimplementsUserDao{
privateSqlSessionsqlSession;
publicvoidsetSqlSession(SqlSessionsqlSession){
this.sqlSession=sqlSession;
}
publicUsergetUser(StringuserId){
return(User)sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId);
}
}
如下注入SqlSessionTemplate:
<beanid="userDao"class="org.mybatis.spring.sample.dao.UserDaoImpl">
<propertyname="sqlSession"ref="sqlSession"/>
</bean>
SqlSessionTemplate有一個使用ExecutorType作為參數的構造方法。
這允許你用來建立對象,比如,一個批量SqlSession,但是使用了下列Spring配置的XML檔案:
<beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">
<constructor-argindex="0"ref="sqlSessionFactory"/>
<constructor-argindex="1"value="BATCH"/>
</bean>
現在你所有的語句可以批量操作了,下面的語句就可以在DAO中使用了。
publicvoidinsertUsers(User[]users){
for(Useruser:users){
sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser",user);
}
}
注意,如果所需的執行方法和預設的SqlSessionFactory設定不同,這種配置風格才能使用。
對這種形式需要說明的是當這個方法被調用時,不能有一個存在使用不同ExecutorType運作的事務。
也要保證在不同的事務中,使用不同執行器來調用SqlSessionTemplate時,(比如PROPAGATION_REQUIRES_NEW)或完全在一個事務外面。
SqlSessionDaoSupport
SqlSessionDaoSupport是一個抽象的支援類,用來為你提供SqlSession。
調用getSqlSession()方法你會得到一個SqlSessionTemplate,之後可以用于執行SQL方法,就像下面這樣:
publicclassUserDaoImplextendsSqlSessionDaoSupportimplementsUserDao{
publicUsergetUser(StringuserId){
return(User)getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId);
}
}
通常MapperFactoryBean是這個類的首選,因為它不需要額外的代碼。
但是,如果你需要在DAO中做其它非MyBatis的工作或需要具體的類,那麼這個類就很有用了。
SqlSessionDaoSupport需要一個sqlSessionFactory或sqlSessionTemplate屬性來設定。
這些被明确地設定或由Spring來自動裝配。如果兩者都被設定了,那麼SqlSessionFactory是被忽略的。
假設類UserMapperImpl是SqlSessionDaoSupport的子類,它可以在Spring中進行如下的配置:
<beanid="userMapper"class="org.mybatis.spring.sample.mapper.UserDaoImpl">
<propertyname="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>