mybatis系列之运行原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31156277/article/details/80959009

1.1 框架分层

这里写图片描述

mybatis架构分层


1.2 SqlSessionFactory

通过断点调试查看SqlSessionFactory的创建过程

private SqlSession getSqlSession() throws Exception {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    //1. 获取SqlSessionFactory
    //通过源码查看创建过程:
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 获取SqlSession
    return sqlSessionFactory.openSession();
}

这里写图片描述


把配置文件的信息解析并保存在Configuration对象中,返回包含了ConfigurationDefaultSqlSession对象.

这里写图片描述


configuration中包含了所有配置相关的信息。

每个mapperStatement代表每个增删改查标签的全部信息。


1.3 SqlSession

这里写图片描述

返回SqlSession的实现类DefaultSqlSession对象。它里面包含了ExecutorConfiguration;Executor会在这一步被创建

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中,比如 Servlet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。下面的示例就是一个确保 SqlSession 关闭的标准模式:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

在你的所有的代码中一致性地使用这种模式来保证所有数据库资源都能被正确地关闭


1.4 mapper接口

这里写图片描述

在mapper中包含了SqlSession对象。


1.5 查询过程

查询流程大致如下:

这里写图片描述

  • StatementHandler:处理sql语句预编译,设置参数等相关工作;
  • ParameterHandler:设置预编译参数用的
  • ResultHandler:处理结果集
  • TypeHandler:在整个过程中,进行数据库类型和javaBean类型的映射

这里写图片描述


一级二级缓存
这里写图片描述


/*
* 总结:
*   1、根据配置文件(全局,sql映射)初始化出Configuration对象
*   2、创建一个DefaultSqlSession对象,
*       他里面包含Configuration以及
*       Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
*  3、DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
*  4、MapperProxy里面有(DefaultSqlSession);
*  5、执行增删改查方法:
*       1)、调用DefaultSqlSession的增删改查(Executor);
*       2)、会创建一个StatementHandler对象。
*           (同时也会创建出ParameterHandler和ResultSetHandler)
*       3)、调用StatementHandler预编译参数以及设置参数值;
*           使用ParameterHandler来给sql设置参数
*       4)、调用StatementHandler的增删改查方法;
*       5)、ResultSetHandler封装结果
*  注意:
*   四大对象每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);
* 
* /

参考

http://www.atguigu.com/download.shtml#MyBatis
http://www.cnblogs.com/dongying/p/4142476.html

猜你喜欢

转载自blog.csdn.net/qq_31156277/article/details/80959009
今日推荐