Mybatis通过接口完成映射过程

1.概述

为了简化Mybatis的使用,Mybatis提供了接口方式自动化生成调用过程的机制,可以大大简化MyBatis的开发

2.实现过程

2.1开发映射文件

<?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="cn.wyy.mapper.UserMapper">
    <select id="selectOrderByAge" resultType="cn.wyy.domain.User">
        select * from user order by age;
    </select>
    <select id="selectAll" resultType="cn.wyy.domain.User">
        select * from user;
    </select>
    <select id="selectById" resultType="cn.wyy.domain.User">
        select * from user where id = #{id};
    </select>
    <select id="selectByAgeRange" resultType="cn.wyy.domain.User">
        select * from user where age between #{min} and #{max};
    </select>
    <insert id="insertUser">
        insert into user values (null,#{name},#{age});
    </insert>
</mapper>

2.2开发接口
注意:开发接口时,必须满足以下四个要求
1.接口的全路径名应该为映射文件中声明的名称空间
2.接口中应该声明和映射文件中sql对应的名称相同的方法
3.方法接收的参数应该和sql中接收的参数一致
4.方法的返回值应该和sql中声明的返回值类型一致

public interface UserMapper {
    public List<User> selectOrderByAge();
    public List<User> selectAll();
    public User selectById(int id);
    public List<User> selectByAgeRange(@Param("min") int min,@Param("max") int max);
    public void insertUser(User user);
}

2.3开发测试类
在测试类中,接口对应的userMapper直接调用了selectByAgeRange()方法,其实这里不是接口对象去调用的方法,在上一步调用getMapper时就可以理解为返回了一个实现类对象,因为在Mybatis中getMapper底层是采用动态代理实现的然后向上造型给接口对象。在idea中可以通过下图所示的图标进入到动态代理的源码,查看其实现。

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
 
public class Test{
 
    @Test
    public void test01() throws IOException {
        //1.创建SqlSessionFactory
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //2.创建SqlSession
        SqlSession session = factory.openSession();
        //3.调用sql
        UserMapper userMapper = session.getMapper(UserMapper.class);
        List<User> list = userMapper.selectByAgeRange(20, 30);
        System.out.println(list);
        //4.销毁session
        session.close();
    }
}

3.小结

真正的开发中,都是使用这种接口+配置文件方式,实现Mybatis的使用

实现过程
3.1Mybatis启动,解析slqMapConfig.xml得到映射文件路径
3.2加载映射文件,根据配置的namespace找到对应的处理接口
3.3自动生成UserMapper的实现类,在其中实现了声明的所有方法,对应到映射文件中的sql
3.4当通过sqlSession.getMapper获取映射接口时,实际上返回的是Mybatis为该接口实现的实现类对象

posted @ 2021-11-23 09:49  一刹流云散  阅读(258)  评论(0编辑  收藏  举报