From 8e3600d7005a685ae314aa033da48fe50bda27c9 Mon Sep 17 00:00:00 2001 From: qjwxpz Date: Sun, 1 Mar 2020 20:13:45 +0800 Subject: [PATCH] 032-week-08 --- ...6\346\227\266\345\272\217\345\233\276.txt" | 14 ++++++++++++ ...3\346\227\266\345\272\217\345\233\276.txt" | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 "week_08/32/MyBatis\345\210\235\345\247\213\345\214\226\346\227\266\345\272\217\345\233\276.txt" create mode 100644 "week_08/32/MyBatis\350\277\220\350\241\214\346\265\201\347\250\213\346\227\266\345\272\217\345\233\276.txt" diff --git "a/week_08/32/MyBatis\345\210\235\345\247\213\345\214\226\346\227\266\345\272\217\345\233\276.txt" "b/week_08/32/MyBatis\345\210\235\345\247\213\345\214\226\346\227\266\345\272\217\345\233\276.txt" new file mode 100644 index 0000000..3b02715 --- /dev/null +++ "b/week_08/32/MyBatis\345\210\235\345\247\213\345\214\226\346\227\266\345\272\217\345\233\276.txt" @@ -0,0 +1,14 @@ +1: 加载xml配置文件 +2: 创建XMLConfigbuilder对象用来解析XML配置文件,生成Configuration对象 +3: 将XML配置文件内的信息解析成Java对象Configuration对象 + 3.1:首先处理properties节点 + 3.2:处理typeAliases + 3.3:处理插件 + 3.4:处理objectFactory + 3.5:objectWrapperFactory + 3.6:settings + 3.7:处理environments + 3.8:database + 3.9:typeHandlers + 3.10:mappers,它将解析Mapper.xml配置文件 +4:根据Configuration对象创建出SqlSessionFactory对象 diff --git "a/week_08/32/MyBatis\350\277\220\350\241\214\346\265\201\347\250\213\346\227\266\345\272\217\345\233\276.txt" "b/week_08/32/MyBatis\350\277\220\350\241\214\346\265\201\347\250\213\346\227\266\345\272\217\345\233\276.txt" new file mode 100644 index 0000000..9b21e81 --- /dev/null +++ "b/week_08/32/MyBatis\350\277\220\350\241\214\346\265\201\347\250\213\346\227\266\345\272\217\345\233\276.txt" @@ -0,0 +1,22 @@ +1. 创建SqlSessionFactory + 1.1:首先调用SqlSessionFactoryBuilder的build方法来初始化加载配置文件这里前面已经分析过了,此处给返回SqlSessionFactory对象 +2. 创建SqlSession + 1.1:SqlSession通过SqlSessionFactory的opensession方法返回的 +3. 创建Mapper代理对象 + 3.1:首先通过SqlSession这个具体实现类是DefaultSqlSession的getMapper来获取代理对象 + 3.2:然而DefaultSqlSession什么都不做,将mapper的获取交给了Configuration了。Configuration的getMapper方法 + 3.3:接着又被转交给MapperRegistry对象的getMapper方法 + 3.4:MapperProxyFactory的newInstance方法,我们可以看出这里使用了动态代理机制,而代理类就是MapperProxy +4. 代理Mapper对象调用查询方法 + 4.1:MapperProxy的invoke方法最终会被代理对象调用 + 4.2: MapperMethod 处理mapper接口的方法,调用 mapperMethod.execute(sqlSession, args);此处根据不同的sql语句类型来处理调用sqlSession对应的方法, + 而这个SqlCommandType从哪里来,答案就在前面的xml解析中的MappedStatement对象,而MappedStatement又保存在Configuration中, + 前面说过Configuration是MyBatis这个调度配置中心,详情可以MapperMethod构造方法中查看SqlCommand对象。 + 4.3: SimpleExecutor默认sql执行器的创建在Configuration中的newExecutor方法中 + 4.4: SimpleExecutor默认sql执行器的query方法, 此方法来自他的基类BaseExecutor ,SimpleExecutor并没有重写该方法,但是此处执行BaseExecutor此方法的意义就是sql的生成。 + 4.5: BoundSql 通过SqlSource(实现类DynamicSqlSource)的getBoundSql方法获取,取得了BoundSql也就取得了动态生成后的sql语句就可以交给Executor执行了。 + 4.6: 在XMLScriptBuilder中的此方法中就已经保存到了SqlSource MixedSqlNode 会根据SqlNode的不同执行不同类别的sqlNode的apply方法正真根据参数生成可执行sql语句 + 4.7: BaseExecutor的 queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql); + 4.8: doquery方法,BaseExecutor的doquery为抽象方法,所以具体实现在它的非抽象子类SimpleExecutor默认sql执行器中 + 4.9: 当追踪查询语句执行时返现MappedStatement的创建在 Configuration中的newStatementHandler方法中调用 RoutingStatementHandler的构造方法中创建的 + 4.10: sql执行StatementHandler的query方法 \ No newline at end of file -- Gitee