SprignMVC+myBatis整合(一)—— 基于MapperFactoryBean



学习本节内容请先看"MyBatis的基本应用"。地址:http://lydia-fly.iteye.com/admin/blogs/2152948

Spring与MyBatis整合需要引入mybatis-spring.jar文件包。

 

其提供了与整合相关的API:

SqlSessionFactoryBean

--为整合应用提供SqlSession对象资源

MapperFactoryBean

--根据指定的Mapper接口生成Bean实例

MapperScannerConfigurer

--根据指定包批量扫描Mapper接口并生成实例

 

SqlSessionFactoryBean:

在单独使用MyBatis时,所有操作都是围绕SqlSession展开的,SqlSession是通过SqlSessionFactory获取的,SqlSessionFactory又是通过SqlSessionFactoryBuilder创建生成的。

 在SpringMvc+MyBatis整合时,同样需要SqlSession。SqlSessionFactoryBean这个组件通过原来的SqlSessionFactoryBuilder生成SqlSessionFactory对象,为整合应用提供SqlSession对象。

Java代码 复制代码  收藏代码
  1. <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  2.     <property name="driverClassName" value="oracle.jdbc.OracleDriver" />  
  3.     <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />  
  4.     <property name="username" value="jsd1403" />  
  5.     <property name="password" value="root" />  
  6. </bean>  
  7.   
  8. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  9.     <property name="dataSource" ref="myDataSource" />  
  10.     <property name="mapperLocations" value="classpath:com/lydia/entity/*.xml" />  
  11. </bean>  
	<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
		<property name="username" value="jsd1403" />
		<property name="password" value="root" />
	</bean>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
		<property name="mapperLocations" value="classpath:com/lydia/entity/*.xml" />
	</bean>

 

MapperFactoryBean:

其作用是根据Mapper接口获取我们想要的Mapper对象,它封装了原有的session.getMapper()功能的实现。

在定义MapperFactoryBean时,需要注入一下两个属性:

--SqlSessionFactoryBean对象,用于提供SqlSession

--要返回Mapper对象的Mapper接口

 

MapperFactoryBean配置如下:

Java代码 复制代码  收藏代码
  1. <!-- 方法一:定义mapper -->  
  2.     <bean id="deptMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
  3.         <property name="mapperInterface" value="com.lydia.entity.DeptMapper"></property>  
  4.         <!-- 指定SqlSessionFactoryBean对象 -->  
  5.         <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>  
  6.     </bean>  
<!-- 方法一:定义mapper -->
	<bean id="deptMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="com.lydia.entity.DeptMapper"></property>
		<!-- 指定SqlSessionFactoryBean对象 -->
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>

 

MapperScannerConfigurer配置使用:

 

注意:使用MapperFactoryBean时,当有一个Mapper(可以理解为表对应的映射文件)就MapperFactoryBean,当mapper少数可以通过applicationContext配置文件,通过id获取。

如果大量的mapper,需要使用mybatis-spring.jar通过的MapperScannerConfigurer组件,通过这个组件可以自动扫描指定包下的各个Mapper接口,并注册对应的MapperFactoryBean对象。

 

把之前的MapperFactoryBean的配置注释掉,换成如下配置依然执行通过:

 

Java代码 复制代码  收藏代码
  1. <!--方法2:  
  2.         可以把扫描到的Mapper接口变成Mapper对象-->  
  3. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  4.     <!--指定要扫描包: 多个包用逗号隔开 -->  
  5.     <property name="basePackage" value="com.lydia,com.tarena" />  
  6.     <!--指定sqlSessionFactory -->  
  7.     <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>  
  8. </bean>  
	<!--方法2:
         可以把扫描到的Mapper接口变成Mapper对象-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!--指定要扫描包: 多个包用逗号隔开 -->
		<property name="basePackage" value="com.lydia,com.tarena" />
		<!--指定sqlSessionFactory -->
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>

   注意:上面sqlSessionFactory属性也可以不用指定,默认会以Autowired方式注入。

 

   如果指定的某个包下并不完全是我们定义的Mapper接口,我们也可以通过自定义注解的方式指定生成MapperFactoryBean对象。

配置如下:

Java代码 复制代码  收藏代码
  1. <!--方法3:  
  2.     只要Mapper类前面加上@MyBatisRepository 这个自己指定的注解就OK-->  
  3.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  4.         <property name="basePackage" value="com.lydia" />  
  5.         <property name="annotationClass" value="com.lydia.annotation.MyBatisRepository" />  
  6.     </bean>  
<!--方法3:
    只要Mapper类前面加上@MyBatisRepository 这个自己指定的注解就OK-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.lydia" />
		<property name="annotationClass" value="com.lydia.annotation.MyBatisRepository" />
	</bean>

 

自定义注解:MyBatisRepository.java 

Java代码 复制代码  收藏代码
  1. public @interface MyBatisRepository {  
  2. }  
public @interface MyBatisRepository {
}

在DeptMapper接口中使用: 

Java代码 复制代码  收藏代码
  1. //@Repository("deptMapper")  
  2. @MyBatisRepository  
  3. public interface DeptMapper {  
  4.     void addDept(Dept dept);  
  5.     void deleteDept(Dept dept);  
  6.     void updateDept(Dept dept);  
  7.     ......  
  8. }  
//@Repository("deptMapper")
@MyBatisRepository
public interface DeptMapper {
	void addDept(Dept dept);
	void deleteDept(Dept dept);
	void updateDept(Dept dept);
    ......
}

 

 测试:

Java代码 复制代码  收藏代码
  1. public class TestCase {  
  2.     @Test  
  3.     public void testFindAll() throws Exception {  
  4.         String conf = "applicationContext.xml";  
  5.         ApplicationContext ac = new ClassPathXmlApplicationContext(conf);  
  6.         //获取对应的mapper对象,并调用mapper接口中对应的方法  
  7.         DeptMapper mapper = ac.getBean("deptMapper", DeptMapper.class);  
  8.         List<Dept> lists = mapper.findAllDept();  
  9.         for (Dept dept : lists) {  
  10.             System.out.println(dept);  
  11.         }  
  12.     }  
  13. }  
public class TestCase {
	@Test
	public void testFindAll() throws Exception {
		String conf = "applicationContext.xml";
		ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
		//获取对应的mapper对象,并调用mapper接口中对应的方法
		DeptMapper mapper = ac.getBean("deptMapper", DeptMapper.class);
		List<Dept> lists = mapper.findAllDept();
		for (Dept dept : lists) {
			System.out.println(dept);
		}
	}
}

 

width="680" height="90" src="http://lydia-fly.iteye.com/iframe_ggbd/794" frameborder="0" scrolling="no">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值