美文网首页走进框架内部
Mybatis要懂的那些知识

Mybatis要懂的那些知识

作者: ReentrantSucc | 来源:发表于2019-01-27 11:49 被阅读34次
  • mybatis-config.xml里<environments>标签可以放置多个environment,这里可以切换test和develop数据源
  • databaseIdProvider提供多种数据库,在xml映射文件里选择databaseId即可使用对应的数据库
  • Oracle的自增是使用Sequence实现的,若要获取插入数据的主键,在xml映射里写上selectKey标签,select seq.nextval from dual;
  • 哪些地方不能使用占位符?比如分表时表名,orderby,desc
  • @Mapkey("id")指定返回类型为map时,将id作为key

1. mybatis参数绑定的过程

我们写一个UserMapper接口,Mybatis会为改接口创建一个MapperProxy对象。

1.1 MapperRegistry

在继续之前,先来了解一下MapperRegistry。

  1. MapperRegistry是mapper的注册类,提供了注册一个包下面的所有Mapper接口。内部维护了一个private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<Class<?>, MapperProxyFactory<?>>();map以mapper接口类为key,value是接口类对应的代理工厂。
    void addMapper(Class<T> type)方法简单的将type放进knownMappers里面。不过,这里面还有
        MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);
        parser.parse();

这样一个解析操作,暂不做分析。

  1. <T> T getMapper(Class<T> type, SqlSession sqlSession)该方法是本类最重要的一个方法了,获取Mapper接口的代理对象也正是从该方法获取的。
    该方法实现就是,knownMappers.get(type)得到代理对象工厂mapperProxyFactory,返回的是mapperProxyFactory.newInstance(sqlSession)
    进入该方法发现过程也比较简单,构造了一个MapperProxy对象
   public T newInstance(SqlSession sqlSession) {
    final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
  }

再进去看

  protected T newInstance(MapperProxy<T> mapperProxy) {
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }

发现这就是标准的JDK面向接口的动态代理啊。要问对应的InvocationHandler在哪里?mapperProxy就是啦。
至此,Mybatis如何获取Mapper接口的代理对象已经解决。
再梳理一下整个流程:

sqlsession.getMapper->configuration.getMapper->mapperRegistry.getMapper->获取Mapper代理对象

1.2

创建好MapperProxy对象之后,调用Mapper.xx方法时就会走MapperProxy的invoke方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {//如果方法是在Object里面的,放行
        return method.invoke(this, args);
      } else if (isDefaultMethod(method)) {
        return invokeDefaultMethod(proxy, method, args);
      }
    } catch (Throwable t) {
      throw ExceptionUtil.unwrapThrowable(t);
    }
    final MapperMethod mapperMethod = cachedMapperMethod(method);//缓存method方法
    return mapperMethod.execute(sqlSession, args); // 执行
  }

发现关键点在于mapperMethod.execute(sqlSession, args)方法

相关文章

  • Mybatis要懂的那些知识

    mybatis-config.xml里标签可以放置多个environment,这里可以...

  • 设计师要懂那些前端知识

    随着最近十年前端的飞速发展,前端技术已经成为互联网产品中举足轻重的技术。作为设计师,了解一部分的前端知识,对于自身...

  • 知识要懂温故

    生活在被裹挟向前的时代,一个劲地往前赶,恨不能自己能多出来个分身;恨不得自己是个’机器车’;钻进了提升效率、管...

  • 有些知识要懂

    1、人要识趣。很多时候,沉默或者不正面答应就代表着拒绝,不要逼着别人说出NO。撕破脸皮后,大家都尴尬。 2、那些说...

  • Intellij 第三章 测试Spring整合MyBatis

    0、如需查看Spring整合MyBatis知识请访问 MyBatis入门【十二】 Spring整合MyBatis基...

  • UX设计师要懂那些前端知识

    随着最近十年前端的飞速发展,前端技术已经成为互联网产品中举足轻重的技术。作为设计师,了解一部分的前端知识,对于自身...

  • 全网已破千万点击!MyBatis源码:配置、映射文件SQL执行过

    本篇MYBAITS灵魂知识点总结 MYBATIS的实现原理 MYBATIS的映射文件 MYBATIS的动态SQL ...

  • 女人要懂的中医知识

    女人脾虚三大原因:情绪敏感多思、运动少和过度减肥。 女人脸色发青一般是脾虚肝火旺引起的 ​。 胸部想要充分发育,有...

  • MyBatis 入门知识

    一、MyBatis 一些不太重要的知识,了解即可 二、MyBatis 功能架构 三、MyBatis 工作流机制 四...

  • 10.Spring集成Mybatis-plus之crud

      前面我们已经学习mybatis相关知识,领略了mybatis的强大。但是有没有发现mybatis的一些缺陷。在...

网友评论

    本文标题:Mybatis要懂的那些知识

    本文链接:https://www.haomeiwen.com/subject/qqegjqtx.html