浅析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中可以通过下图所示的图标进入到动态代理的源码,查看其实现。

 

package cn.wyy.test;

import cn.wyy.domain.*;
import cn.wyy.mapper.UserMapper;
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 Test01 {

    @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为该接口实现的实现类对象

4.写在最后

在idea中可以安装一个小插件free-idea-mybatis,使用很方便。

free-idea-mybatis是一个提高mybatis编码的插件。实现了dao代码跳转到mapper,mapper跳转回dao,mapper文件、statement查询自动生成功能 。

安装后点击箭头就能实现方法与mapper的跳转等功能。。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值