MyBatis本质、底层与执行流程
MyBatis执行流程
-
本质:反射机制实现MyBatis三大类的创建
-
底层:使用动态代理接管dao层接口操作
-
执行流程:MyBatis工具类 => 【MyBatisUtils】,按照【官方使用步骤】:
-
获取核心配置文件【mybatis-config.xml】中的配置
try{ // 指定配置文件路径 String resource = "mybatis-config.xml"; // 读取局部变量【resource】中的核心配置文件,并将其所有配置转化为input流 // getResourceAsStream需要try...catch InputStream inputStream = Resources.getResourceAsStream(resource); }catch(Exception e){ e.printStackTrace(); }
-
实例化SqlSessionFactoryBuilder构造器
// 调用SqlSessionFactoryBuilder()类的build()方法创建SqlSessionFactory对象 /* public class SqlSessionFactoryBuilder{ .. SqlSessionFactory build(InputStream inputStream) { return build(inputStream, null, null); } .. } */ SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
解析【1.获取核心配置文件中的配置】中配置好的文件解析流inputStream
// SqlSessionFactoryBuilder.build()重载 public SqlSessionFactory build(InputStream inputStream) { return build(inputStream, null, null); } // SqlSessionFactoryBuilder.build()终会执行该build()方法: // XMLConfigBuilder.parse()完成对核心配置文件的解析 public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { reader.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } }
-
实例化一个【按1.配置核心配置文件】的DefaultSqlSessionFactory
// 使用Configuration类存放所有XML配置信息,并传递给SqlSessionFactory对象 public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
- 创建SqlSession对象
-
创建executor执行器
- delegate = (SimpleExecutor)
- tcm = (TranscationalCacheManager)
- transcationalCache
- autoCommit = true | false
- dirty = true | false
- cursorList = null
-
完成CRUD操作
-
判断事务
- 成功提交
- 失败回滚executor
-
本文来自博客园,作者:Cn_FallTime,转载请注明原文链接:https://www.cnblogs.com/CnFallTime/p/16032265.html