???
有时候我们指定的基包下面的并不全是我们定义的Mapper接口,为此MapperScannerConfigurer还为我们提供了另外两个可以缩小搜索和注册范围的属性。一个是annotationClass,另一个是markerInterface。
?
annotationClass:当指定了annotationClass的时候,MapperScannerConfigurer将只注册使用了
annotationClass注解标记的接口。 ?
markerInterface:markerInterface是用于指定一个接口的,当指定了markerInterface之后,
MapperScannerConfigurer将只注册继承自markerInterface的接口。
如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。即使用了annotationClass进行标记或者继承自markerInterface的接口都将被注册为一个MapperFactoryBean。
现在假设我们的Mapper接口都继承了一个SuperMapper接口,那么我们就可以这样来定义我们的MapperScannerConfigurer。
Xml代码
??? value=\/> ???
如果是都使用了注解MybatisMapper标记的话,那么我们就可以这样来定义我们的MapperScannerConfigurer。
Xml代码
??? value=\/> ???
除了用于缩小注册Mapper接口范围的属性之外,我们还可以指定一些其他属性,如:
?
sqlSessionFactory:这个属性已经废弃。当我们使用了多个数据源的时候我们就需要通过sqlSessionFactory
来指定在注册MapperFactoryBean的时候需要使用的SqlSessionFactory,因为在没有指定sqlSessionFactory的
时候,会以Autowired的方式自动注入一个。换言之当我们只使用一个数据源的时候,即只定义了一个SqlSessionFactory的时候我们就可以不给MapperScannerConfigurer指定SqlSessionFactory。 ?
sqlSessionFactoryBeanName:它的功能跟sqlSessionFactory是一样的,只是它指定的是定义好的
SqlSessionFactory对应的bean名称。 ?
sqlSessionTemplate:这个属性已经废弃。它的功能也是相当于sqlSessionFactory的,因为就像前面说的那
样,MapperFactoryBean最终还是使用的SqlSession的getMapper方法取的对应的Mapper对象。当定义有多个SqlSessionTemplate的时候才需要指定它。对于一个MapperFactoryBean来说SqlSessionFactory和SqlSessionTemplate只需要其中一个就可以了,当两者都指定了的时候,SqlSessionFactory会被忽略。 ?
sqlSessionTemplateBeanName:指定需要使用的sqlSessionTemplate对应的bean名称。
注意:由于使用sqlSessionFactory和sqlSessionTemplate属性时会使一些内容在PropertyPlaceholderConfigurer之前加载,导致在配置文件中使用到的外部属性信息无法被及时替换而出错,因此官方现在新的Mybatis-Spring中已经把sqlSessionFactory和sqlSessionTemplate属性废弃了,推荐大家使用sqlSessionFactoryBeanName属性和sqlSessionTemplateBeanName属性。
Xml代码
???
??? ??? xsi:schemaLocation=\ ??? http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ??? http://www.springframework.org/schema/context ??? http://www.springframework.org/schema/context/spring-context-3.0.xsd ??? http://www.mybatis.org/schema/mybatis ??? http://www.mybatis.org/schema/mybatis/mybatis-spring.xsd ??? http://www.springframework.org/schema/mvc ??? http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd\> ??? ??? class=\ ??? destroy-method=\> ??? ??? ??? class=\> ??? value=\ /> ??? ??? value=\/> ???
SqlSessionTemplate
除了上述整合之后直接使用Mapper接口之外,Mybatis-Spring还为我们提供了一种直接使用SqlSession的方式。Mybatis-Spring为我们提供了一个实现了SqlSession接口的SqlSessionTemplate类,它是线程安全的,可以被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的。而且它还可以自己管理Session的提交和关闭。当使用了Spring的事务管理机制后,SqlSession还可以跟着Spring的事务一起提交和回滚。
使用SqlSessionTemplate时我们可以在Spring的applicationContext配置文件中如下定义:
这样我们就可以通过Spring的依赖注入在Dao中直接使用SqlSessionTemplate来编程了,这个时候我们的Dao可能是这个样子:
Java代码
??? package com.tiantian.mybatis.dao; ???
??? import java.util.List;
??? import javax.annotation.Resource;
??? import org.mybatis.spring.SqlSessionTemplate; ??? import org.springframework.stereotype.Repository; ??? import com.tiantian.mybatis.model.Blog; ???
??? @Repository
??? publicclass BlogDaoImpl implements BlogDao { ???
??? private SqlSessionTemplate sqlSessionTemplate; ???
??? publicvoid deleteBlog(int id) { ???
sqlSessionTemplate.delete(\, id); ??? } ???
??? public Blog find(int id) { ???
returnsqlSessionTemplate.selectOne(\ctBlog\, id); ??? } ???
??? public List
returnthis.sqlSessionTemplate.selectList(\electAll\); ??? } ???