一旦你获得一个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属性,就像下面的代码:
publicclassUserDaoImplimplementsUserDao{
privateSqlSessionsqlSession;
publicvoidsetSqlSession(SqlSessionsqlSession){
this.sqlSession=sqlSession;
}
publicUsergetUser(StringuserId){
return(User)sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser",userId);
}
}
如下注入SqlSessionTemplate:
<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>