SqlSessionTemplate
SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。
SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。
当调用 SQL 方法时(包括由 getMapper()
方法返回的映射器中的方法),SqlSessionTemplate
将会保证使用的 SqlSession
与当前 Spring 的事务相关。此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions
。
由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate
来替换 MyBatis 默认的 DefaultSqlSession
实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
可以使用 SqlSessionFactory
作为构造方法的参数来创建 SqlSessionTemplate
对象。
在spring的配置文件applicationContex.xml
中添加:
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
这个bean现在可以直接注入到DAO bean中。你需要在bean中添加一个SqlSession
属性(sqlSession接口,sqlSessionTemplate是sqlSession接口是实现类),就像下面的代码:
public class UserDaoImpl implements UserDao{
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession){
this.sqlSession = sqlSession;
}
public User getuser(String userId){
return (User)sqlSession.selectOne
("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId);
}
}
在spring的配置文件applicationContex.xml
中添加如下配置, 注入SqlSessionTemplate
:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
等价于:
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
@Qualifier("sqlSessionTemplate")
private SqlSessionTemplate sqlSessionTemplate;
....
}
使用注解的dao层实现类:
@Repository
public class DeptDaoImpl implements DeptDao {
private static final String NAMESPACE = DeptDao.class.getPackage().getName() + "." + DeptDao.class.getSimpleName() + ".";
@Autowired
@Qualifier("sqlSessionTemplate")
private SqlSessionTemplate sqlSessionTemplate;
@Override
public List<PtDept> selectAllDepts() {
return sqlSessionTemplate.selectList(NAMESPACE + "selectAllDepts");
}
@Override
public int addDept(PtDept ptDept) {
return sqlSessionTemplate.insert(NAMESPACE + "addDept",ptDept);
}
@Override
public int updateDept(PtDept ptDept) {
return sqlSessionTemplate.update(NAMESPACE + "updateDept",ptDept);
}
@Override
public int deleteDepts(List<PtDept> depts) {
return sqlSessionTemplate.delete(NAMESPACE + "deleteDepts",depts);
}
}
SqlSessionDaoSupport
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法.
getSqlSession()
方法是抽象类SqlSessionDaoSupport
中的public修饰的方法
就像下面这样:
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
属性来设置。这些被明确地设置或由Spring来自动装配。如果两者都被设置了,那么sqlSessionFactory
是被忽略的。
假设类UserMapperImpl是SqlSessionDaoSupport的子类,它可以在Spring中进行如下的配置:
<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
评论前必须登录!
注册