学科分类
目录
SSM框架

基于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接口实现类的代理对象,从而简化我们的开发。

点击此处
隐藏目录