首页 > 编程语言 >MyBatis源码之getMapper获取代理对象

MyBatis源码之getMapper获取代理对象

时间:2023-05-29 09:00:43浏览次数:47  
标签:getMapper return 代理 sqlSession 源码 MyBatis type MapperProxy

MyBatis源码之getMapper获取代理对象

下面这句话意思非常明了,就是通过传入接口类型对象,获取接口代理对象。

IUserDao userDao1 = sqlSession1.getMapper(IUserDao.class);

具体的过程如下:

一、首先,调用SqlSession的实现类DefaultSqlSession的getMapper方法,其实是在该方法内调用configuration的getMapper方法,将接口类对象以及当前sqlsession对象传入。

  //DefaultSqlSession.java
  @Override
  public <T> T getMapper(Class<T> type) {
    //调用configuration的getMapper
    return configuration.<T>getMapper(type, this);
  }

二、接着调用我们熟悉的mapperRegistry,因为我们知道,在读取配置文件,创建sqlSession的时候,接口类型信息就已经被存入到其内部维护的Map之中。

//Configuration.java
  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
		return mapperRegistry.getMapper(type, sqlSession);
  }

三、我们来看看getMapper方法具体的实现如何:

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    //根据传入的类型获取对应的键,也就是这个代理工厂
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
      //最终返回的是代理工厂产生的一个实例对象
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }

四、紧接着,我们进入MapperProxyFactory,真真实实地发现了创建代理对象的过程。


  protected T newInstance(MapperProxy<T> mapperProxy) {
    //创建MapperProxy代理对象
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }

  public T newInstance(SqlSession sqlSession) {
    //MapperProxy是代理类,
    final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
  }

标签:getMapper,return,代理,sqlSession,源码,MyBatis,type,MapperProxy
From: https://www.cnblogs.com/jundong2177/p/17439433.html

相关文章

  • webpack的工作流程(附带部分源码分析)
    @目录webpack的工作流程webpack的准备阶段本阶段流程和钩子modules和chunks的生成阶段module解析解析流程chunks生成文件生成阶段模板hash更新模板渲染chunk生成文件总结webpack的工作流程说明工作流程之前,先抛出两个结论:webpack的核心功能,是抽离成很多个内部插件来实现......
  • make项目的源码阅读
    这里下载https://ftp.gnu.org/gnu/make/make-4.4.tar.gz进行研读。目标研读的初始目的,是想看看make打印的构建命令在哪执行的。构建makemake项目本身的编译,可以用./configure&&make来完成。代码挖呀挖make中target抽象为structfile,并用链来组织,structfile{cons......
  • Mybatis-plus做分页和联表查询
    示例首先先从代码上看一下我在框架中是如何使用的分页:注: AboutusHomepage是实体类 1.Controller@RequestMappingpublicStringindex(@RequestParam(value="pageNo",required=false,defaultValue="1")IntegerpageNo,@Reque......
  • 常见项目——C语言实现2048小游戏(附源码和可执行文件)
    1.实现效果展示1.1界面图片说明:进入下面各页面后均可通过按键“q”来退出。1)菜单页2)开始游戏页3)游戏规则页4)按键说明页5)退出游戏页1.2视频展现戳此处查看视频演示1.3游戏源码及可执行文件(exe)下载支持作者,请关注公众号“优秀物联人”回复“2048小游戏”获取下......
  • mybatis 动态查询
    可以不用where标签然后拼一个1=1   when至少有一个分支会执行    批量删除   批量插入   多表联查   里面有集合的时候oftype  分页    ......
  • 基于JAVA的springboot+vue摄影跟拍预定管理系统,附源码+数据库+论文+PPT
    1、项目介绍困扰管理层的许多问题当中,摄影跟拍预定管理一定是不敢忽视的一块。但是管理好摄影跟拍预定又面临很多麻烦需要解决,例如有几个方面:第一,往往用户人数都比较多,如何保证能够管理到每一用户;第二,如何在工作琐碎,记录繁多的情况下将摄影跟拍预定的当前情况反应给领导......
  • mybatis 查询 map 多参数
         返回map 返回一个大map 主键id作为keyvalue本身作为map  ......
  • Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联
     Vo:/***用来返回给前端展示列表的数据实体*/@DatapublicclassCourseVoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringid;privateStringtitle;privateStringsubjectParentTitle;private......
  • springboot整合mybatis实现简单的crud操作
    使用MyBatis框架操作数据,在SpringBoot框架集成MyBatis,项目整体结构前提:准备一张student表。SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforuser------------------------------DROPTABLEIFEXISTS`student`......
  • Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询
     一、引言MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么今天说说MP怎么自定义sql语句吧。 二、具体实现使用注解实现:在我们Mapper接口中定义自定义方法即可。/***@Date:2019/6/1014:40*@Description</span>:User对象持久层*/p......