![](https://img-blog.csdnimg.cn/337d316c0617452aab8c13b505e00700.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《Mybatis从0到1》
文章平均质量分 79
Mybatis
为人师表好少年
横下一条心,才能干成一件事
展开
-
《Mybatis框架》第1章 全局配置文件
1.mybatis-config.xml模板(template)<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> </configuration>2.属原创 2021-11-24 20:34:41 · 796 阅读 · 0 评论 -
《Mybatis框架》第2章 Mapper映射文件
一、基础使用1.mybatis-config.xml模板<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.jianan.mapper.xxx"></ma原创 2021-11-24 20:35:56 · 738 阅读 · 0 评论 -
《Mybatis源码》第3章 解析全局配置文件
一、引入1.使用案例<!-- Mybatis依赖 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version></dependency><!-- MySQL依赖 --><dependency原创 2021-11-24 20:36:33 · 347 阅读 · 0 评论 -
《Mybatis源码》第4章 解析XML映射文件
XMLMapperBuilder上文我们介绍了通过XMLConfigBuilder来加载全局配置文件mybatis-config.xml,读取了各种配置,但里面比较重要的读取mapper,因为我们使用Mybatis框架,更多的关注点实在mapper映射文件的sql编写上,接下来我们详细看一下1.调用链上文说到在XMLConfigBuilder类中的parse()里面调用mapperElement()读取mapper文件,接下来看一下如何加载mapper文件private void mapperEle原创 2021-11-24 20:37:12 · 280 阅读 · 0 评论 -
《Mybatis源码》第5章 解析Mapper接口
1.调用链上一章我们介绍了,如何解析Mapper.xml文件,那么这次我们看一下如何解析Mapper接口,首先回顾一下mapper解析的方法mapperElement()private void mapperElement(XNode parent) throws Exception { if (parent != null) { // 遍历 for (XNode child : parent.getChildren()) { if ("package".原创 2021-11-24 20:37:41 · 327 阅读 · 0 评论 -
《Mybatis源码》第6章 标签封装类
一、请求MappedStatement我们的DML标签会被封装成MappedStatement对象,该类的关键点都在字段上,其它的方法都是最简单的赋值,public final class MappedStatement { // 路径来源 private String resource; private Configuration configuration; // DML标签id private String id; // 单次查询数量 private Integer原创 2021-11-24 20:38:14 · 162 阅读 · 0 评论 -
《Mybatis源码》第7章 SqlSession
一、SqlSessionFactory前两章我们已经介绍了如何解析mybatis-config.xml和mapper文件,同时也生成了我们的全局配置对象configuration,那么就通过SqlSessionFactoryBuilder创建了一个DefaultSqlSessionFactory返回public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {原创 2021-11-24 20:39:12 · 407 阅读 · 1 评论 -
《Mybatis源码》第8章 SqlSession四大组件(一)
一、Executor 执行器引入在上面创建SqlSession的时候,我们创建了执行器Executor,接下来介绍一下执行器Executor的作用,顾名思义,就是负责指挥执行,我们在创建SqlSession的时候,将执行器和配置等信息封装到其里面,根据配置通过Executor调用Statement执行,然后通过ResultSetHandler处理结果,它就相当于一个指挥官,负责指挥其它组件有条不絮的工作下图展示了从接口代理开始,经过核心组件处理,然后返回结果Executor基本类型有三种,SIM原创 2021-11-24 20:39:54 · 267 阅读 · 0 评论 -
《Mybatis源码》第9章 SqlSession四大组件(二)
四、ResultSetHandler 结果集处理器ResultSetHandlerpublic interface ResultSetHandler { // 将Statement执行后产生的结果集映射为结果列表 <E> List<E> handleResultSets(Statement stmt) throws SQLException; // 处理游标查询结果 <E> Cursor<E> handleCursorResultSets(原创 2021-11-24 20:40:54 · 368 阅读 · 0 评论 -
《Mybatis源码》第10章 MapperProxy代理
调用链之前已经介绍到了如何创建DefaultSqlSession,下一步就是通过会话创建对应的Mapper接口了,但是按照我们Java的知识,接口是没有办法直接创建的,那么Mybatis是如何处理这个的? 其实这里是采用了代理// 我们自己编写的创建获取Mapper的代码CarMapper mapper = sqlSession.getMapper(CarMapper.class);DefaultSqlSession 类获取Mapper@Overridepublic <T> T原创 2021-11-24 20:41:24 · 509 阅读 · 0 评论 -
《Mybatis源码》第11章 Cache缓存
一、基础使用1.概述MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。缓存可以极大的提升查询效率,当开启了缓存以后,数据库的查询流程是二级缓存 --> 一级缓存 --> 数据库Mybatis系统中默认定义了两级缓存一级缓存:默认情况下,只有一级缓存开启二级缓存:二级缓存需要手动开启和配置,他是基于namespace级别的缓存为了提高扩展性,Mybatis定义了缓存接口cache,我们可以通过实现Cache接口来自定义二级缓存2.一级缓存1)基础原创 2021-11-25 23:33:01 · 450 阅读 · 0 评论 -
《Mybatis源码》第12章 延迟加载和懒加载
一、延迟加载总结嵌套查询会借助一级缓存,所以一级缓存不能关闭嵌套查询是肯定会延迟加载的,存入DeferredLoad类,避免重复的查询执行执行嵌套查询时,当有结果值就直接存入,没有就存入一个占位符,这样相同的嵌套查询,在一级缓存中只会存在一个,当所有的都处理完成以后,然后再最终处理所有的延迟加载循环依赖图中展示了循环依赖的效果,最简单的方法就是用一次查一次,但是可以使用延迟加载来提高效率延迟加载延迟加载就是当执行嵌套查询的时候,如果该嵌套查询的结果已经存在,就直接使用,不必再次查询,这原创 2021-11-25 23:33:29 · 599 阅读 · 0 评论 -
《Mybatis源码》第13章 SqlSource
总结SqlSource 负责执行静态编译 / 动态编译SqlNode 负责处理解析各种动态SQLBoudnSql 负责保存解析SQL后的最终结果将 #{} 替换成 ? 是在SqlSourceBuilder中,并且创建ParameterMapping将 ${}解析成对应的值,会在TextSqNode中完成一、BoundSqlBoundSql 主要为SQL解析之后的实体类,包含 sql 和 参数映射public class BoundSql { // SQL语句 private f原创 2021-11-25 23:34:01 · 478 阅读 · 0 评论 -
《Mybatis源码》第14章 LanguageDriver
总结LanguageDriver借助XMLScriptBuilder解析标签,创建SqlSourceXMLScriptBuilder负责解析XML标签,也就是这里负责解析,封装成SqlNode,然后在调用的时候,再根据参数解析,拼接成最后的SQL引入在执行器执行query()方法的时候,会直接在MappedStatement里面获取BoundSql @Override public <E> List<E> query(MappedStatement ms, Obj原创 2021-11-25 23:34:36 · 958 阅读 · 1 评论 -
《Mybatis源码》第15章 Transaction
事务工厂(TransactionFactory)TransactionFactory该接口有2个子类JdbcTransactionFactory 和 ManagedTransactionFactory,分别代表JDBC类型 和 MANAGED类型JdbcTransactionFactory 生产JdbcTransaction,会使用Connection对象的commit()、rollback()、close()方法来管理方法ManagedTransactionFactory生产ManagedTrans原创 2021-11-25 23:35:07 · 230 阅读 · 0 评论 -
《Mybatis源码》第16章 reflection
一、org.apache.ibatis.reflection.propertyPropertyTokenizer 值分词器在MetaObject的代码示例中看到,我们可以通过 car.name 来获取子对象,当然这个是可以循环嵌套的,例如: person[0].car.name 等,那么它是如何获取的最关键的部分就是通过这个值分词器,在MetaObject类里面的setValue() 和 getValue() 都创建了这个类这个类的关键点就是实现 Iterator 迭代器接口,通过其来实现循环解原创 2021-11-25 23:35:37 · 483 阅读 · 0 评论 -
《Mybatis源码》第17章 Configuration
一、Configuration 配置体系Configuration概述Configuration 是整个MyBatis的配置体系集中管理中心,前面所学Executor、StatementHandler、Cache、MappedStatement…等绝大部分组件都是由它直接或间接的创建和管理。此外影响这些组件行为的属性配置也是由它进行保存和维护。如cacheEnabled、lazyLoadingEnabled … 等。所以说它是MyBatis的大管家很形象。核心作用总结存储全局配置信息,其来源于se原创 2021-11-25 23:36:09 · 236 阅读 · 1 评论 -
《Mybatis源码》第18章 plugin插件
一、源码分析InterceptorChain 拦截器链XMLConfigBuilder会将解析mybatis-config.xml插件的结果存储到该类中,也就是字段interceptors里面SqlSession四大组件会通过pluginAll()注册拦截器public class InterceptorChain { // 自定义拦截器集合 这里面包含的是我们在mybatis-config里面定义的插件 private final List<Interceptor>原创 2021-11-25 23:36:43 · 486 阅读 · 0 评论 -
《Mybatis源码》第19章 parsing解析
介绍一下org.apache.ibatis.parsing包下面负责解析的类TokenHandler 令牌处理public interface TokenHandler { // 处理令牌 并且返回处理结果 String handleToken(String content);}GenericTokenParser通用的令牌解析,该类的主要作用就是将被openToken 和 closeToken包含的内容,替换成TokenHandler返回的内容例如: 将 #{} 替换成 ?原创 2021-11-25 23:37:16 · 136 阅读 · 0 评论 -
《Mybatis源码》第20章 ErrorContext 全局异常信息
# ErrorContext 错误日志mybatis在读取mapper文件的时候,会存在下面这行代码,那么它用到了ErrorContext类,那么该类的作用是啥?ErrorContext.instance().resource(resource);MyBatis 还有一个很有意思的点在于异常日志的输出。不知道大家有没有发现,使用 MyBatis 时定位问题非常容易,我们只需要查看一下控制台的异常日志就能一目了然地知道问题出现在了哪里。就像这样:1.存储异常信息的字段MyBatis 异常涵盖的信原创 2021-11-25 23:37:54 · 721 阅读 · 3 评论