[Mybatis] Mapper接口原理分析

上篇文章中,是直接用SqlSession.selectList()去执行一条SQL的,但是作为 一个ORM框架,我们往往是调用接口去执行,如下所示:

    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(inputStream);

    SqlSession sqlSession = factory.openSession();
    UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
    userMapper.selectAllUser();//直接调用接口执行

    sqlSession.close();

但是UserMapper只是一个接口,并没有相应的实现类。我们都知道接口要有实现类才能实例化进而调用,但是那么Myabtis是如何实现调用没有实现类的方法,还能完成相应的SQL处理逻辑。

其实原理很简单:这个是用了JDK的动态代理技术,首先为UserMapper生成一个代理对象,由代理对象去调用SqlSession方法。也就是说在调用链SqlSession作为参数一直传递下去,并交给代理对象,真正的执行操作还是由SqlSession去执行的。

下面我们来分析下这其中的过程,先看下sqlSession.getMapper()方法:

 @Override
  public <T> T getMapper(Class<T> type) {
    //从配置中获取,注意这两个参数,一个是接口UserMapper.class,另一个是SqlSession自身,特别是SqlSession这个参数,后文一系列的调用链都有这个参数的
    return configuration.<T>getMapper(type, this);
  }

再看下configuration.getMapper()

  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
   
    //其实是调用了MapperRegistry的方法
    return mapperRegistry.getMapper(type, s
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值