MyBatic与Spring的整合,Mapper接口方式的开发

2021年09月15日 阅读数:1
这篇文章主要向大家介绍MyBatic与Spring的整合,Mapper接口方式的开发,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本文摘自:Java EE企业级应用开发教程,有部分修改html

在MyBatis+Spring项目中,虽然使用传统DAO的开发能够实现所需功能,可是采用这种方式在实现类中会出现大量重复代码,在方法中也须要指定映射文件中执行语句的Id,而且不能保证编写时的Id的正确性(运行时才能知道)。为此,咱们可使用MyBatis提供的另外一种编程方式,Mapper接口编程。java

本文假定你的MyBatis与Spring环境已经搭建完毕,数据结构及测试数据也已经导入数据库,实体类(Customer.java)也已经建立,参考:MyBatic与Spring的整合,传统DAO方式的开发spring

3、Mapper接口方式的开发

一、建立接口类

package com.itheima.mapper;
import com.itheima.po.Customer;
public interface CustomerMapper {
    // 经过id查询客户
    public Customer findCustomerById(Integer id);
    
    // 添加客户
    public void addCustomer(Customer customer);
}

二、建立映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.CustomerMapper">
    <!--根据id查询客户信息 -->
    <select id="findCustomerById" parameterType="Integer"
             resultType="customer">
        select * from t_customer where id = #{id}
    </select>
    
    <!--添加客户信息 -->
    <insert id="addCustomer" parameterType="customer">
        insert into t_customer(username,jobs,phone)
        values(#{username},#{jobs},#{phone})
    </insert>
</mapper>

注意:此文件与接口文件位于同一个目录。sql

三、在mybatis-config-spring.xml配置文件中,增长以下代码:

    <mappers> 
       <mapper resource="com/itheima/mapper/CustomerMapper.xml" />
    </mappers>

四、在applicationContext-mybatis.xml配置文件中,增长以下代码:

    <!-- 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。数据库

五、建立测试类

package com.itheima.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import 
     org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.mapper.CustomerMapper;
import com.itheima.po.Customer;

/**
 * DAO测试类
 */
public class DaoTest {
//    @Test
    public void findCustomerByIdMapperTest(){    
        ApplicationContext act = 
                new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
        CustomerMapper customerMapper = act.getBean(CustomerMapper.class);   
        Customer customer = customerMapper.findCustomerById(1);
        System.out.println(customer);
    }
    
    @Test
    public void addCustomerTest(){    
        ApplicationContext act = 
                new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
        CustomerMapper customerMapper = act.getBean(CustomerMapper.class);   
        Customer customer = new Customer();
        customer.setUsername("李咏");
        customer.setJobs("测试哦");
        customerMapper.addCustomer(customer);
    }
}

addCustomerTest方法输出:编程

DEBUG [main] - ==>  Preparing: insert into t_customer(username,jobs,phone) values(?,?,?) 
DEBUG [main] - ==> Parameters: 李咏(String), 测试哦(String), null
DEBUG [main] - <==    Updates: 1

findCustomerByIdMapperTest输出:数据结构

DEBUG [main] - ==>  Preparing: select * from t_customer where id = ? 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
Customer(id=1, username=张三, jobs=测试工程师, phone=13099992222)

几条建议:

一、Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致;mybatis

二、Mapper.xml文件中的namespace与Mapper接口的类路径相同(放在同一个包中);app

三、Mapper接口中的方法名和Mapper.xml中定义的每一个执行语句的id相同;post

四、Mapper接口中方法的输入参数类型要与Mapper.xml中定义的每一个SQL的parameterType的类型相同;

五、Mapper接口方法的输出参数类型要和Mapper.xml中定义的每一个SQL的resultType的类型相同。