天天看點

【SSM】Mybatis之SqlSession

在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>
           

繼續閱讀