文章目錄
- 前言
- 一、SqlSessionTemplate
- 1. 創建
- 2. 使用
- 3. 批量操作
- 3.1 創建SqlSessionTemplate
- 3.2 service
- 3.3 controller
- 二、SqlSessionDaoSupport
- 總結
前言
在 MyBatis 中,你可以使用 SqlSessionFactory 來創建 SqlSession。 一旦你獲得一個 session 之后,你可以使用它來執行映射了的語句,提交或回滾連接,最后,當不再需要它的時候,你可以關閉 session。 使用 MyBatis-Spring 之后,你不再需要直接使用 SqlSessionFactory 了,因為你的 bean 可以被注入一個線程安全的 SqlSession,它能基于 Spring 的事務配置來自動提交、回滾、關閉 session。
一、SqlSessionTemplate
1. 創建
SqlSessionTemplate 是 MyBatis-Spring 的核心。作為 SqlSession 的一個實現,這意味著可以使用它無縫代替你代碼中已經在使用的 SqlSession。 SqlSessionTemplate 是線程安全的,可以被多個 DAO 或映射器所共享使用。
當調用 SQL 方法時(包括由 getMapper() 方法返回的映射器中的方法),SqlSessionTemplate 將會保證使用的 SqlSession 與當前 Spring 的事務相關。 此外,它管理 session 的生命周期,包含必要的關閉、提交或回滾操作。另外,它也負責將 MyBatis 的異常翻譯成 Spring 中的 DataAccessExceptions。
由于模板可以參與到 Spring 的事務管理中,并且由于其是線程安全的,可以供多個映射器類使用,你應該總是用 SqlSessionTemplate 來替換 MyBatis 默認的 DefaultSqlSession 實現。在同一應用程序中的不同類之間混雜使用可能會引起數據一致性的問題。
可以使用 SqlSessionFactory 作為構造方法的參數來創建 SqlSessionTemplate 對象。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory" />
</bean>@Configuration
public class MyBatisConfig {@Beanpublic SqlSessionTemplate sqlSession() throws Exception {return new SqlSessionTemplate(sqlSessionFactory());}
}
2. 使用
Autowired
SqlSessionTemplate sqlSessionTemplate;
3. 批量操作
3.1 創建SqlSessionTemplate
@Bean
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
}
3.2 service
@Autowired
SqlSession sqlSession;public void insertUsers(List<User> users) {for (User user : users) {sqlSession.getMapper(UserMapper.class).insert(user);}
}
3.3 controller
@RequestMapping("003")
public void mybatis003() {List<User> users=new ArrayList<>();for(int i=10;i<20;i++){users.add(new User(i));}userService.insertUsers(users);
}
二、SqlSessionDaoSupport
SqlSessionDaoSupport 是一個抽象的支持類,用來為你提供 SqlSession。調用 getSqlSession() 方法你會得到一個 SqlSessionTemplate,之后可以用于執行 SQL 方法,就像下面這樣:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {public User getUser(String userId) {return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);}
}
在這個類里面,通常更傾向于使用 MapperFactoryBean,因為它不需要額外的代碼。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一個非抽象的實現類,那么這個類就很有用了。
SqlSessionDaoSupport 需要通過屬性設置一個 sqlSessionFactory 或 SqlSessionTemplate。如果兩個屬性都被設置了,那么 SqlSessionFactory 將被忽略。
假設類 UserMapperImpl 是 SqlSessionDaoSupport 的子類,可以編寫如下的 Spring 配置來執行設置:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
總結
回到頂部