在 MyBatis-Spring 整合體系中,SqlSessionTemplate 是核心類別,負責管理 SqlSession 生命週期、事務同步、異常轉換,且線程安全,可被多 DAO 共享。另一支援類 SqlSessionDaoSupport 則提供 getSqlSession() 便利方法,適合需自定義邏輯的 DAO 實現。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public User getUser(String userId) {
return sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSession" ref="sqlSession" />
</bean>
優勢:非侵入式、統一事務管理、線程安全、易於測試。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User getUser(String userId) {
return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!-- 或 <property name="sqlSessionTemplate" ref="sqlSession" /> 兩者擇一 -->
</bean>
注意:若同時設定 sqlSessionFactory 與 sqlSessionTemplate,前者會被忽略。
| 特性 | SqlSessionTemplate | SqlSessionDaoSupport |
|---|---|---|
| 核心定位 | 線程安全的 SqlSession 代理 | DAO 基類支援 |
| 事務整合 | 自動參與 Spring 事務 | 透過模板間接參與 |
| 使用方式 | 直接注入 DAO | 繼承基類 |
| 推薦度 | ⭐⭐⭐⭐⭐ (標準做法) | ⭐⭐⭐ (特殊需求) |
SqlSessionTemplate 而非繼承基類,保持組合優於繼承。MyBatis-Spring 的設計初衷是「零侵入」整合。善用
MapperScannerConfigurer自動掃描 Mapper 介面,配合SqlSessionTemplate統一事務邊界,是最高效的整合姿勢。