MybBatis运行原理

1、获取sqlSessionFactory对象:

解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;
注意:【MappedStatement】:代表一个增删改查的详细信息

2、获取sqlSession对象

返回一个DefaultSQlSession对象,包含Executor和Configuration;
这一步会创建Executor对象;

3、获取接口的代理对象(MapperProxy)

4、执行增删改查方法

MyBatis中的四大对象

Executor执行器 (update, query, flushStatements, commit, rollback,
getTransaction, close, isClosed)
ParameterHandler参数处理器 (getParameterObject, setParameters)
ResultSetHandler结果集处理器 (handleResultSets, handleOutputParameters)
StatementHandler sql语句处理器 (prepare, parameterize, batch, update, query)

1、获取sqlSessionFactory对象:

1.获取sqlSessionFactory对象:
2.SqlsessionFactoryBuilder.build
3.创建解析器parser
4.解析每一个标签把详细信息保存在Configuration 中
5.解析mapper.xml,mepper.xml的每一个元素信息解析出来保存在全局配置
将增删改查标签的每一个标签每一个属性解析出来,封装成一个MappedStatement,一个MappedStatement代表一个增删改查标签
在这里插入图片描述
6.解析每一个标签把详细信息保存在Configuration 中
7.parse方法最终返回了Configuration
8.build(configuration)方法返回了defaultSqlSessionFactory对象
在这里插入图片描述

  1. 先获取mybatis的配置文件,解析成流对象(字符流和字节流都可以)Reader和InputStream都可以

  2. 通过SqlSessionFactoryBuilder根据mybatis的配置文件流创建一个Configuration对象

  3. SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSqlSessionFactory(SqlSessionFactory的默认实现类)

  4. DefaulatSqlSessionFacotry根据传入的参数,创建一个DefaultSqlSession对象,里面包含了Configuration(SqlSession的默认实现类)

2、获取sqlSession对象

由之前解析可知,mybatis启动的时候会加载XML配置文件解析生成全局配置对象Configuration对象,SqlSessionFactoryBuilder类会根据Configuration对象创建一个DefaultSqlSessionFactory对象,而DefaultSqlSessionFactory对象实现了SqlSessionFactory中的创建SqlSession的方法,最终新建了一个SqlSession接口的默认实现类DefaultSqlSession

SqlSession openSession = sqlSessionFactory.openSession();

 @Override
  public SqlSession openSession() {
    return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
   }

从configuration中拿到ExecutorType:执行器类型

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();//根据Configuration获取环境参数对象
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);//根据环境参数对象获取事务工厂对象
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//根据事务工厂创建新的事务对象
      final Executor executor = configuration.newExecutor(tx, execType);//根据Configuration获取执行器对象
      return new DefaultSqlSession(configuration, executor, autoCommit);//根据3个参数创建DefaultSqlSession对象
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

executor=configuration.newExecutor(tx, execType);//根据Configuration获取执行器对象
executor在这时会被拦截器(插件)包装

返回DefaultSqlSession(configuration, executor, autoCommit);//根据3个参数创建DefaultSqlSession对象
在这里插入图片描述

3、获取接口的代理对象(MapperProxy)

会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);

1.这个getmapper方法调用了configuration的.getMapper方法

2.这个configuration的getMapper方法调用了mapperRegistry的getMapper方法
3. 根据接口类型拿到mapperProxyFactory对象
4. mapperProxyFactory.newInstance(sqlsession)
5. newInstance方法创建MapperProxy对象,他是一个InvocationHandler对象
6.在这里插入图片描述
7.返回一个代理对象
在这里插入图片描述
在这里插入图片描述

4、执行增删改查方法

mapperProxy代理对象调用invoke()方法
返回mapperMethod对象的execute(sqlsession,args)方法

1)、调用DefaultSqlSession的增删改查(Executor);
2)、会创建一个StatementHandler对象。
(同时也会创建出ParameterHandler和ResultSetHandler)
3)、调用StatementHandler预编译参数以及设置参数值;
使用ParameterHandler来给sql设置参数
4)、调用StatementHandler的增删改查方法;
5)、ResultSetHandler封装结果
注意:
四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值