Skip to content

Latest commit

 

History

History
18 lines (15 loc) · 1.61 KB

代理模式.md

File metadata and controls

18 lines (15 loc) · 1.61 KB

概述

在了解了元数据的来源之后,我们还会好奇一个问题,只声明了一个接口类,最后到底是怎么执行的呢?这就是代理模式的作用了。 mybatis为每个mapper接口生成一个代理类,代理类中包含了对应的sql语句的执行逻辑。这样我们就可以直接调用接口方法,而不用关心sql语句的执行逻辑。

实现原理

初始化过程

  1. 解析mapper类时,通过MapperProxyFactory生成该mapper接口的代理工厂类。(见MapperRegistry#addMapper)
  2. 在获取mapper的时候,通过代理工厂生成代理类。(见SqlSession#getMapper)

执行过程 3. 调用mapper接口类的方式时,实际上是调用了代理类的invoke方法,而最终是通过映射MapperMethod对应该方法,然后执行MapperMethod的execute方法。(见MapperProxy#invoke) 4. MapperMethod的execute方法中,会通过前置解析sql信息判断该sql是查询还是更新,然后调用SqlSession对应的查询或更新方法。(见MapperMethod#execute) 5. 在调用具体的查询或更新方法前,会先调用ParameterHandler对参数进行处理,然后调用StatementHandler对sql语句进行处理,最后调用ResultSetHandler对结果集进行处理。(见Executor#query)

参数注入思路

  1. 在动态方法执行前,先对参数进行处理,然后通过SqlSession的增删改查方法执行
  2. 在sql执行阶段,封装通用模板处理方式,在执行前后进行参数设置
  3. 参数涉及到不同的参数,处理方式也不同,很容易想到策略模式,通过策略模式用不同的TypeHandler来处理不同的参数设置。