基于MapperFactoryBean的整合
MapperFactoryBean是MyBatis-Spring团队提供的一个用于根据Mapper接口生成Mapper对象的类,该类在Spring配置文件中使用时可以配置以下参数:
● mapperInterface:用于指定接口;
● SqlSessionFactory:用于指定SqlSessionFactory;
● SqlSessionTemplate:用于指定SqlSessionTemplate。如果与SqlSessionFactory同时设定,则只会启用SqlSessionTemplate。
了解了MapperFactoryBean类后,接下来通过一个具体的案例来演示如何通过MapperFactoryBean来实现MyBatis与Spring的整合,具体步骤如下。
(1)在src目录下,创建一个com.itheima.mapper包,然后在该包中创建CustomerMapper接口以及对应的映射文件,编辑后如文件1和文件2所示。
文件11 CustomerMapper.java
1 package com.itheima.mapper;
2 import com.itheima.po.Customer;
3 public interface CustomerMapper {
4 // 通过id查询客户
5 public Customer findCustomerById(Integer id);
6 }
文件2 CustomerMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4 <mapper namespace="com.itheima.mapper.CustomerMapper">
5 <!--根据id查询客户信息 -->
6 <select id="findCustomerById" parameterType="Integer"
7 resultType="customer">
8 select * from t_customer where id = #{id}
9 </select>
10 </mapper>
从文件1和文件2可以看出,这两个文件的实现代码与上一小节中CustomerDao接口以及映射文件CustomerMapper.xml的实现代码基本相同,只是本案例与上一小节案例的区别在于,本案例将接口文件改名并与映射文件一起放在了com.itheima.mapper包中。
(2)在MyBatis的配置文件中,引入新的映射文件,代码如下所示。
<!-- Mapper接口开发方式 -->
<mapper resource="com/itheima/mapper/CustomerMapper.xml" />
小提示:
使用Mapper接口动态代理开发方式时,如果完全遵循了编写规范(请参见本节后面的脚下留心),那么在配置文件中可以不引入映射文件。
(3)在Spring的配置文件中,创建一个id为customerMapper的Bean,代码如下所示。
<!-- Mapper代理开发(基于MapperFactoryBean) -->
<bean id="customerMapper"
class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.itheima.mapper.CustomerMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
上述配置代码为MapperFactoryBean指定了接口,以及SqlSessionFactory。
(4)在测试类DaoTest中,编写测试方法findCustomerByIdMapperTest(),其代码如下所示。
@Test
public void findCustomerByIdMapperTest(){
ApplicationContext act =
new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerMapper customerMapper = act.getBean(CustomerMapper.class);
Customer customer = customerMapper.findCustomerById(1);
System.out.println(customer);
}
上述方法中,通过Spring容器获取了CustomerMapper实例,并调用了实例中的findCustomerById()方法来查询id为1的客户信息。
使用JUnit4执行上述方法后,控制台的输出结果如图1所示。
图1 运行结果
从图1可以看出,通过Mapper接口的方式,同样查询到了相应的客户信息。
脚下留心:Mapper接口编程规范
Mapper接口编程方式只需要程序员编写Mapper接口(相当于DAO接口),然后由MyBatis框架根据接口的定义创建接口的动态代理对象,这个代理对象的方法体等同于上一节中DAO接口的实现类方法。
虽然使用Mapper接口编程的方式很简单,但是在具体使用时还是需要遵循以下规范:
1) Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。
2) Mapper.xml文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件需要放在同一个包中)。
3) Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。
4) Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同。
5) Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql的resultType的类型相同。
只要遵循了这些开发规范,MyBatis就可以自动生成Mapper接口实现类的代理对象,从而简化我们的开发。