首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis-Spring 整合指南:SqlSessionTemplate 與 SqlSessionDaoSupport 實戰詳解

     編輯:Java 相關知識

核心組件概覽

在 MyBatis-Spring 整合體系中,SqlSessionTemplate 是核心類別,負責管理 SqlSession 生命週期、事務同步、異常轉換,且線程安全,可被多 DAO 共享。另一支援類 SqlSessionDaoSupport 則提供 getSqlSession() 便利方法,適合需自定義邏輯的 DAO 實現。

方案一:SqlSessionTemplate 注入(推薦)

1. Bean 定義

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

2. DAO 實現

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);
    }
}

3. 注入配置

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
    <property name="sqlSession" ref="sqlSession" />
</bean>

優勢:非侵入式、統一事務管理、線程安全、易於測試。

方案二:繼承 SqlSessionDaoSupport

適用場景

  • DAO 中需混合非 MyBatis 操作(如 JDBC、JPA)。
  • 需自定義具體 DAO 基類,而非單純 Mapper 代理。

代碼實現

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    public User getUser(String userId) {
        return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
}

Spring 配置

<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    <!-- 或 <property name="sqlSessionTemplate" ref="sqlSession" /> 兩者擇一 -->
</bean>

注意:若同時設定 sqlSessionFactory 與 sqlSessionTemplate,前者會被忽略。

關鍵差異對比

特性SqlSessionTemplateSqlSessionDaoSupport
核心定位線程安全的 SqlSession 代理DAO 基類支援
事務整合自動參與 Spring 事務透過模板間接參與
使用方式直接注入 DAO繼承基類
推薦度⭐⭐⭐⭐⭐ (標準做法)⭐⭐⭐ (特殊需求)

最佳實踐建議

  1. 優先使用 MapperFactoryBean:無需寫 DAO 實現類,直接注入 Mapper 介面最簡潔。
  2. 需自定義邏輯時:注入 SqlSessionTemplate 而非繼承基類,保持組合優於繼承。
  3. 避免使用 DefaultSqlSession:非線程安全、無法參與 Spring 事務,易導致數據不一致。

MyBatis-Spring 的設計初衷是「零侵入」整合。善用 MapperScannerConfigurer 自動掃描 Mapper 介面,配合 SqlSessionTemplate 統一事務邊界,是最高效的整合姿勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved