1. 程式人生 > >【SSM】Mybatis之SqlSession

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