3.3 获取Mapper对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.3 获取Mapper对象相关的知识,希望对你有一定的参考价值。

参考技术A 有一个 DefaultSqlSession 之后, 还要找到 Mapper.xml 里面定义的 Statement ID,才能执行对应的 SQL 语句。

找到 Statement ID 有两种方式:

由于接口名称跟 Mapper.xml 的 namespace 是对应的, 接口的方法跟 statement ID 也都是对应的,所以根据方法名就能找到对应的要执行的 SQL。

DefaultSqlSession.getMapper() 调用了 Configuration.getMapper() 。 Configuration.getMapper() 又调用了 MapperRegistry.getMapper()

在解析 mapper 标签和 Mapper.xml 的时候,已经把接口类型和类型对应的 MapperProxyFactory 放到了一个 Map 中。 获取 Mapper 代理对象, 实际上是从 Map 中获取对应的工厂类后,调用以下方法创建对象:

最终通过代理模式返回代理对象:

JDK 动态代理代理,在实现了 InvocationHandler 的代理类里面,需要传入一个被 代理对象的实现类。

MyBatis 的动态代理不需要实现类的原因:我们只需要根据接口类型+方法的名称, 就可以找到 Statement ID 了,而唯一要做的一件事情也是这件,所以 不需要实现类 。在 MapperProxy 里面直接执行逻辑(也就是执行 SQL)就可以。

获得 Mapper 对象的过程, 实质 上是获取了一个 MapperProxy 的代理对象。 MapperProxy 中有 sqlSession、mapperInterface、methodCache。

Mapper.xml中对象的关联

对象的关联,特别是manytoone的关联,有两种方式:发送一条额外sql去查询和内联的方式

发送一条额外sql:当我在使用到这个关联对象的时候,我发送一条额外的sql去把这个关联的对象查询出来,然后设置到对象里面,这样容易造成n+1的问题

内联方式:在这条sql直接把关联的对象的表连接进来,把需要查询的信息全部查出来,然后直接在resultMap中拼装出关联的对象,这样就可以避免n+1的问题,但是会造成连接的性能损耗

选用原则 :

如果关联的对象要在列表中显示,那么直接使用内联的方式,会造成表关联的性能损耗

如果要在查看这个对象时才显示,则选择使用发送一条额外的sql进行查询的方式,但是会造成n+1的问题

选用哪种方式?

 选用发送一条额外sql

因为在列表中不用显示借款人的信息,而是当我们要去查看这个借款人的信息时,当我们要去查看他的借款明细的时候,才会去点开看他的信息,这个属性要查看某个对象时,才会显示。

 

mapper.xml中关联的写法

使用发送额外的sql查询,则下面这条sql语句不用变

 

乐观锁的问题

 

 

 

n+1问题,网上查了下资源

 

以上是关于3.3 获取Mapper对象的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis——源码解析MyBatis框架底层的执行原理

MyBatis——源码解析MyBatis框架底层的执行原理

SpringBoot集成MyBatis通用Mapper4

MyBatis Mapper四步走

MyBatis Mapper四步走

3.3 JSP内置对象概述