mybatis的简单执行流程-面试用

1、Configuration

XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象

XMLConfigBuilder parser > Configuration

SqlSessionFactory = new DefaultSqlSessionFactory ( config );

session = factory.openSession();

sqlSession.getMapper(UserMapper.class);

通过Session来得到UserMapper.java类的代理对象。

每一个Mapper文件都有一个对应的MapperProxyFactory,为什么需要MapperProxyFactory

2、因为MapperProxyFactory可以用来生成代理对象。

MapperProxyFactory是如何产生代理对象: 内部通过目标类转成MapperProxy,在通过Proxy生成代理对象。

MapperProxy实现了InvocationHandler接口,所以MapperProxy具有拦截功能,

Proxy如何产生对象的

Proxy.newProxyInstance(getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);

注意第一个参数是类加载器,第二个是代理要实现的接口,第三个参数是InvocationHandler的实例对象。

Proxy把MapperProxy当做InvocationHandler,Mapper当做接口来生成代理类。最终代理类会实现UserMapper接口,并且被调用时,会被InvocationHandler拦截也就是被MapperProxy拦截。

当调用方法,会被MapperProxy的invoke方法拦截,invoke会做下面操作

通过方法名Method查询得到MapperMethodInvoker对象,MapperMethodInvoker是做什么

3、MapperMethod

MapperMethod主要包含下面2个东西

java 复制代码
private final MapperMethod.SqlCommand command;
private final MapperMethod.MethodSignature method;

public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {
    this.command = new MapperMethod.SqlCommand(config, mapperInterface, method);
    this.method = new MapperMethod.MethodSignature(config, mapperInterface, method);
}

SqlCommand和MethodSignature干嘛用的。

1、SqlCommand一个内部类 封装了SQL标签的类型insert update delete select

2、MethodSignature一个内部类 封装了方法的参数信息 返回类型信息等

MapperMethod有个execute,就是开始执行sql的操作.在execute里面,通过类型找到事insert还是update,在通过返回值类型找具体方法,处理类型

在通过类+方法名当做ID去Mapper.xml里面找对应的sql执行语句。

关于MapperMethod可以看这个文章:《MapperMethod》

相关推荐
执键行天涯3 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
工业甲酰苯胺3 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
ggdpzhk5 小时前
Mybatis 快速入门(maven)
oracle·maven·mybatis
Java小白笔记15 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
计算机学姐19 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
程序员大金19 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
惜.己1 天前
MyBatis中一对多关系的两种处理方法
java·开发语言·后端·sql·mysql·mybatis·idea
终末圆1 天前
MyBatis动态SQL中的`if`标签使用【后端 19】
java·数据结构·数据库·sql·算法·spring·mybatis
飞翔的佩奇1 天前
Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)
java·数据库·spring boot·毕业设计·maven·mybatis·医院管理系统
这孩子叫逆1 天前
35. MyBatis中的缓存失效机制是如何工作的?
java·spring·mybatis