当前位置: 首页 > news >正文

出口跨境电商平台seo优化代理

出口跨境电商平台,seo优化代理,南浔住房和城乡建设局网站,店铺设计属于什么设计Mybatis源码分析 Mybatis源码分析入口1. 读取配置文件总结 2. 解析配置文件核心代码(一)核心代码(二)分析parse()方法分析build()方法 总结 3. 获取SqlSession总结 4. 获取mapper代理对象总结 5. 使用mapper代理对象执行Sql语句二…

Mybatis源码分析

    • Mybatis源码分析入口
    • 1. 读取配置文件
      • 总结
    • 2. 解析配置文件
      • 核心代码(一)
      • 核心代码(二)
        • 分析parse()方法
        • 分析build()方法
      • 总结
    • 3. 获取SqlSession
      • 总结
    • 4. 获取mapper代理对象
      • 总结
    • 5. 使用mapper代理对象执行Sql语句
      • 二级缓存
      • 一级缓存
      • 总结

Mybatis源码分析入口

本文将根据下面这段代码进行源码分析

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<UserEntity> list = mapper.listUser();
System.out.println(list);
sqlSession.close();

1. 读取配置文件

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

ClassLoaderWrapper.java

在这里插入图片描述


总结

从入口一路点击进去可以发现底层是通过调用java.lang.ClassLoader#getResourceAsStream方法来读取resources目录下的mybatis-config.xml文件,并得到InputStream对象

2. 解析配置文件

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactoryBuilder.java

在这里插入图片描述

在这里插入图片描述


核心代码(一)

XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);

XMLConfigBuilder.java

在这里插入图片描述

XPathParser.java

在这里插入图片描述

可以发现底层是将InputStream对象转换成Document对象,并将Document对象保存至当前类(XPathParser)的document属性中

继续回到上一层,点击进入this()方法

XMLConfigBuilder.java

在这里插入图片描述

可以发现this()方法主要是在进行部分属性的初始化,并将XPathParser对象保存至当前类(XMLConfigBuilder)的parser属性中。
关键点:初始化了父类的configuration属性。


核心代码(二)

return build(parser.parse());

分析parse()方法


XMLConfigBuilder.java

在这里插入图片描述

  1. 根据Document对象获取节点为configuration的配置信息,并转换成XNode对象

XPathParser.java

在这里插入图片描述

  1. 将XNode对象解析成Configuration对象

XMLConfigBuilder.java

在这里插入图片描述

XMLConfigBuilder.java

在这里插入图片描述


点击进入addMappers(mapperPackage)方法


Configuration.java

在这里插入图片描述

MapperRegistry.java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

从这里可以发现parser.parse()主要是在解析配置文件(mybatis-config.xml),具体过程是根据Document对象获取节点为configuration的配置信息,并转换成XNode对象再解析各个节点,重点部分是mappers节点的解析。
在解析mappers节点的代码中可以发现如果是使用package或class注册mapper可以直接注册mapper接口对象,如果是使用url或者resource注册mapper则需要先解析mapper.xml映射文件后并通过namespace找到所绑定的接口对象再进行注册。
mapper的注册是通过MapperRegistry对象完成的,而MapperRegistry则是Configuration对象里面的一个属性,也就是说所有的配置解析完成后都存放在Configuration对象中。
parser.parse()最终返回Configuration对象。

分析build()方法


SqlSessionFactoryBuilder.java

在这里插入图片描述

DefaultSqlSessionFactory.java

在这里插入图片描述

从这里可以发现SqlSessionFactoryBuilder将得到的Configuration对象建造成DefaultSqlSessionFactory对象,也就是SqlSessionFactory对象。


总结

SqlSessionFactoryBuilder先是通过XMLConfigBuilder解析配置文件并将解析得到的配置装载到Configuration对象中,再将Configuration建造成DefaultSqlSessionFactory对象。

这里采用了建造者设计模式
BaseBuilder:所有解析器的父类,包含配置文件实例,为解析文件提供一些通用的方法;
XMLConfigBuilder:主要负责解析mybatis-config.xml文件;
XMLMapperBuilder:主要负责解析mapper.xml文件;
XMLStatementBuilder:主要负责解析映射文件中的SQL节点;

Configuration对象核心属性释义:

  1. MapperRegistry:mapper接口动态代理工厂类的注册中心;
  2. ResultMap:用于解析mapper.xml文件中的resultMap节点,使用ResultMapping来封装id、result等子元素;
  3. MappedStatement:用于存储mapper.xml文件中的select、insert、update和delete节点,同时还包含了这些节点的很多重要属性;
  4. SqlSource:用于创建BoundSql,mapper.xml文件中的sql语句会被解析成BoundSql对象,经过解析BoundSql包含的语句最终仅仅包含?占位符,可以直接提交给数据库执行;

3. 获取SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

DefaultSqlSessionFactory.java

在这里插入图片描述

Configuration.java

在这里插入图片描述
在这里插入图片描述

从这里可以看到如果没有设置执行器类型,则会默认使用简单执行器类型

ExecutorType.java

在这里插入图片描述

上面枚举类中的三种执行器类型均可通过openSession()传参设置


点击进入openSessionFromDataSource()方法


DefaultSqlSessionFactory.java

在这里插入图片描述

openSessionFromDataSource()方法有三个入参:ExecutorType execType(执行器类型)、TransactionIsolationLevel level(事务隔离级别)、boolean autoCommit(是否自动提交)

  1. 获取TransactionFactory

DefaultSqlSessionFactory.java

在这里插入图片描述

TransactionFactory有两种:JdbcTransactionFactory,ManagedTransactionFactory
通过mybatis-config.xml文件进行配置

在这里插入图片描述

<transactionManager type="JDBC"/>

这里配置的是JdbcTransactionFactory

  1. 获取Transaction

JdbcTransactionFactory.java

在这里插入图片描述

JdbcTransaction.java

在这里插入图片描述

  1. 根据Transaction和执行器类型获取执行器(核心代码)

Configuration.java

在这里插入图片描述

CachingExecutor.java

在这里插入图片描述

Mybatis默认使用的执行器是SimpleExecutor,SimpleExecutor的父类是BaseExecutor,BaseExecutor下一共有三个子类也就是三种执行器:BatchExecutor、SimpleExecutor、ReuseExecutor,这三种执行器均可通过传值设置。

cacheEnabled默认值为true,说明Mybatis默认会使用CachingExecutor。进入CachingExecutor类可以发现,CachingExecutor是在上面三种执行器(BaseExecutor)的基础上做了一层包装(装饰器设计模式),先调用CachingExecutor再调用BaseExecutor,是对BaseExecutor类的增强。

cacheEnabled可以通过mybatis-config.xml文件进行配置

<settings><!-- 是否开启二级缓存 --><setting name="cacheEnabled" value="false"/>
</settings>

BaseExecutor是一级缓存(默认开启),默认使用SimpleExecutor,CachingExecutor是二级缓存(默认开启,但还需要做一些额外的配置才能生效)

  1. 生成DefaultSqlSession

在这里插入图片描述

将Configuration、Executor、autoCommit等信息包装成DefaultSqlSession对象,并且返回该对象


总结

openSession()是SqlSessionFactory接口中的一个重载方法,可以配置执行器类型、事务隔离级别、是否自动提交等参数,Configuration负责判断当前使用的执行器(Executor),DefaultSqlSessionFactory最后将Configuration、Executor、autoCommit等信息包装成DefaultSqlSession对象并返回。

这里采用了装饰器设计模式

BaseExecutor是一级缓存(默认开启),BaseExecutor是BatchExecutor、SimpleExecutor、ReuseExecutor三种执行器的父类。

  1. SimpleExecutor:默认的Executor,每个SQL执行的时候都会创建新的Statement;
  2. ReuseExecutor:相同的SQL会重复使用Statement;
  3. BatchExecutor:用于批处理的Executor;

CachingExecutor是二级缓存(默认开启,但还需要做一些额外的配置才能生效)
CachingExecutor:可缓存数据的Executor,用装饰器模式包装了其它的执行器(如BaseExecutor下的三种执行器)

4. 获取mapper代理对象

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

DefaultSqlSession.java

在这里插入图片描述

Configuration.java

在这里插入图片描述

MapperRegistry.java

在这里插入图片描述

之前已经对mapper接口进行了注册,这里通过mapper接口类型获取对应的动态代理工厂类(MapperProxyFactory),动态代理工厂类使用JDK动态代理技术生成mapper代理对象并返回该对象。

MapperProxyFactory.java

在这里插入图片描述

MapperProxy.java

在这里插入图片描述

JDK动态代理技术主要用于拦截和修改方法的调用,在使用mapper代理对象调用mapper接口中的方法时MapperProxy中的invoke方法也会被执行。

总结

根据mapper接口类型从MapperRegistry中获取对应的动态代理工厂类(MapperProxyFactory),动态代理工厂类使用JDK动态代理技术生成mapper代理对象并返回该对象。在使用mapper代理对象调用方法时底层会走MapperProxy中的invoke方法。

这里采用了JDK动态代理设计模式

MapperRegistry:mapper接口动态代理工厂类的注册中心;
MapperProxyFactory:用于生成动态代理的实例对象;
MapperProxy:动态代理回调类;

5. 使用mapper代理对象执行Sql语句

List<UserEntity> list = mapper.listUser();

在这里插入图片描述

在这里插入图片描述


MapperProxy.java

在这里插入图片描述

在这里插入图片描述

核心代码

mapperMethod.execute(sqlSession, args);

MapperMethod.java

在这里插入图片描述

因为执行的SQL为select,返回值类型为List集合,所以会走executeForMany()方法

在这里插入图片描述

DefaultSqlSession.java

在这里插入图片描述

这个方法是不是很熟悉,没错,这就是在基于XML方式-原生方式开发用到的方法

List<UserEntity> list = sqlSession.selectList("com.mybatis.mapper.UserMapper.listUser", UserEntity.class);

DefaultSqlSession.java

在这里插入图片描述

在这里插入图片描述

二级缓存

如果开启了二级缓存则会使用CachingExecutor

CachingExecutor.java

在这里插入图片描述

  1. 获取SQL语句

在这里插入图片描述

  1. 创建缓存key

在这里插入图片描述

  1. 执行查询逻辑

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

SimpleExecutor中没有query方法,默认走父类(BaseExecutor)


一级缓存

BaseExecutor.java

在这里插入图片描述
在这里插入图片描述

SimpleExecutor.java

在这里插入图片描述

  1. 初始化RoutingStatementHandler对象

Configuration.java

在这里插入图片描述

RoutingStatementHandler.java

在这里插入图片描述

  1. 生成Statement对象

SimpleExecutor.java

在这里插入图片描述

2.1. 获取Connection

BaseExecutor.java

在这里插入图片描述

JdbcTransaction.java

在这里插入图片描述

2.2. 根据不同的StatementHandler创建Statement对象

RoutingStatementHandler.java

在这里插入图片描述

BaseStatementHandler.java

在这里插入图片描述

Mybatis默认采用PreparedStatementHandler处理器

PreparedStatementHandler.java

在这里插入图片描述

2.3. 使用ParameterHandler处理占位符参数

RoutingStatementHandler.java

在这里插入图片描述

PreparedStatementHandler.java

在这里插入图片描述

DefaultParameterHandler.java

在这里插入图片描述

  1. 执行查询逻辑

RoutingStatementHandler.java

在这里插入图片描述

PreparedStatementHandler.java

在这里插入图片描述

DefaultResultSetHandler.java

在这里插入图片描述


总结

在使用代理对象调用方法时,底层会走MapperProxy中的invoke方法,在执行查询语句时,默认会先从二级缓存(CachingExecutor)中读取数据,如果存在则直接返回,不存在则继续查询一级缓存,如果一级缓存(BaseExecutor)中存在则直接返回,不存在则继续查询数据库,在查询数据库时,总体上使用StatementHandler对象和JDBC进行交互,整个查询流程先是使用ParameterHandler对SQL语句的入参进行处理,待SQL语句被执行完后得到结果集,再使用ResultSetHandler对结果集进行处理并返回。

四大核心接口对象

  1. Executor(执行器):负责整个SQL执行过程的总体控制;
  2. StatementHandler(语句处理器):负责和JDBC层的具体交互;
  3. ParameterHandler(参数处理器):负责PreparedStatement入参的具体设置;
  4. ResultSetHandler(结果集处理器):负责将JDBC查询的结果映射为Java对象;

StatementHandler

  1. RoutingStatementHandler:根据StatementType路由到不同的StatementHandler对象;
  2. SimpleStatementHandler:管理Statement对象并向数据库中推送不需要预编译的SQL语句;
  3. PreparedStatementHandler:管理Statement对象并向数据库中推送需要预编译的SQL语句;
  4. CallableStatementHandler:管理Statement对象并调用数据库中的存储过程;

文章转载自:
http://negatively.mrfr.cn
http://thermocurrent.mrfr.cn
http://unorganized.mrfr.cn
http://reconversion.mrfr.cn
http://subtropics.mrfr.cn
http://covenantor.mrfr.cn
http://emote.mrfr.cn
http://moskva.mrfr.cn
http://phosphamidon.mrfr.cn
http://vocational.mrfr.cn
http://arytenoidal.mrfr.cn
http://mips.mrfr.cn
http://sexennium.mrfr.cn
http://betoken.mrfr.cn
http://isodrin.mrfr.cn
http://paludal.mrfr.cn
http://varicotomy.mrfr.cn
http://strained.mrfr.cn
http://titanite.mrfr.cn
http://orpheus.mrfr.cn
http://osnaburg.mrfr.cn
http://indigo.mrfr.cn
http://prognoses.mrfr.cn
http://economy.mrfr.cn
http://yakka.mrfr.cn
http://socman.mrfr.cn
http://approachability.mrfr.cn
http://menthaceous.mrfr.cn
http://unanimous.mrfr.cn
http://solid.mrfr.cn
http://diligency.mrfr.cn
http://pressman.mrfr.cn
http://appease.mrfr.cn
http://musicality.mrfr.cn
http://guardee.mrfr.cn
http://outwatch.mrfr.cn
http://sabbatic.mrfr.cn
http://bobtail.mrfr.cn
http://dab.mrfr.cn
http://caseinate.mrfr.cn
http://flagellatory.mrfr.cn
http://begird.mrfr.cn
http://loot.mrfr.cn
http://takovite.mrfr.cn
http://pianino.mrfr.cn
http://hydridic.mrfr.cn
http://boxing.mrfr.cn
http://ruminative.mrfr.cn
http://scrummage.mrfr.cn
http://demythologize.mrfr.cn
http://taurocholic.mrfr.cn
http://railbus.mrfr.cn
http://flytable.mrfr.cn
http://dee.mrfr.cn
http://homosex.mrfr.cn
http://pyophthalmia.mrfr.cn
http://trucial.mrfr.cn
http://accoucheur.mrfr.cn
http://moneme.mrfr.cn
http://wyvern.mrfr.cn
http://heterostructure.mrfr.cn
http://hempseed.mrfr.cn
http://shortcoat.mrfr.cn
http://orchitis.mrfr.cn
http://copaiba.mrfr.cn
http://semiflexion.mrfr.cn
http://arc.mrfr.cn
http://irl.mrfr.cn
http://doxographer.mrfr.cn
http://claustrum.mrfr.cn
http://hunan.mrfr.cn
http://algesimeter.mrfr.cn
http://crete.mrfr.cn
http://uncomely.mrfr.cn
http://eloquence.mrfr.cn
http://hep.mrfr.cn
http://unspent.mrfr.cn
http://afghanistan.mrfr.cn
http://shopkeeping.mrfr.cn
http://vibrate.mrfr.cn
http://jaup.mrfr.cn
http://torticollis.mrfr.cn
http://concernedly.mrfr.cn
http://netscape.mrfr.cn
http://agami.mrfr.cn
http://zealotic.mrfr.cn
http://amain.mrfr.cn
http://wistful.mrfr.cn
http://bulldoze.mrfr.cn
http://doubt.mrfr.cn
http://subtopic.mrfr.cn
http://crake.mrfr.cn
http://recondense.mrfr.cn
http://fluoric.mrfr.cn
http://primipara.mrfr.cn
http://felinity.mrfr.cn
http://gct.mrfr.cn
http://ventil.mrfr.cn
http://technocomplex.mrfr.cn
http://limpidity.mrfr.cn
http://www.dt0577.cn/news/71466.html

相关文章:

  • 江宁网站建设价格网络营销和传统营销有什么区别
  • java手机网站开发工具搜狗推广
  • jquery 特效 网站网站宣传推广方案
  • 济南学网站建设哪里好东莞营销型网站建设
  • html5餐饮美食订餐微官网wap手机网站模板整站下载怎么制作网站详细流程
  • 共享ip服务器做网站福建seo快速排名优化
  • 网站怎么做运营推广广告推广怎么做
  • 怎么用微信官方网站做二维码优化大师怎么强力卸载
  • 网站竞价难做优化市场营销策划方案案例
  • 长沙网站制作好公司网站怎样才能在百度被搜索到
  • 如何提高网站的访问速度必应搜索引擎入口
  • 微信网站开发是什么火蝠电商代运营公司
  • 天津建设工程网站百度网盘网页
  • 网站优化体验报告全国前十名小程序开发公司
  • 天津做企业网站公司seo服务 收费
  • 网站建设的具体流程现在有什么技能培训班
  • 无锡做网站价格揭阳seo快速排名
  • 做预约的网站计算机培训
  • 为什么没人做物流网站软文代写文案
  • 做赚钱的网站有哪些微博推广怎么做
  • 公司刚做网站在那里找图片做推广信息哪个平台好
  • 高手做网站关键词上首页的有效方法
  • APP开发网站建设哪家好恢复正常百度
  • 专门做装修的网站百度怎么发布广告
  • 三网合一网站建设报价东莞网站优化
  • 网站seo视频狼雨seo教程百度无锡营销中心
  • 如东网站建设哪家好自己建网站怎么弄
  • 作品集用什么网站做预测2025年网络营销的发展
  • 做简单的html网站宣传方式有哪些
  • 5000元网站seo推广武汉seo优