【SSM】Mybatis之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屬性,就像下面的程式碼:如下注入SqlSessionTemplate:publicclassUserDaoImplimplementsUserDao{ privateSqlSessionsqlSession; publicvoidsetSqlSession(SqlSessionsqlSession){ this.sqlSession=sqlSession; } publicUsergetUser(StringuserId){ return(User)sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId); } }
<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>