private SqlSessionFactory sqlSessionFactory;

@Before

public void init() throws IOException {

//--------------------第一步:加载配置---------------------------

// 1.读取mybatis配置文件创SqlSessionFactory

String resource = “mybatis-config.xml”;

InputStream inputStream = Resources.getResourceAsStream(resource);

// 1.读取mybatis配置文件创SqlSessionFactory

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

inputStream.close();

}

@Test

// 快速入门

public void quickStart() throws IOException {

//--------------------第二部,创建代理对象---------------------------

// 2.获取sqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();

// 3.获取对应mapper

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

//--------------------第三步:获取数据---------------------------

// 4.执行查询语句并返回单条数据

TUser user = mapper.selectByPrimaryKey(2);

System.out.println(user);

System.out.println(“----------------------------------”);

// 5.执行查询语句并返回多条数据

// List users = mapper.selectAll();

// for (TUser tUser : users) {

// System.out.println(tUser);

// }

}

}

以上是我们一个使用mybatis访问数据的demo,通过对快速入门代码的分析,可以把 MyBatis 的运行流程分为三大阶段:

  1. 初始化阶段:读取 XML 配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化的工作;

  2. 代理封装阶段:封装 iBatis 的编程模型,使用 mapper 接口开发的初始化工作;

  3. 数据访问阶段:通过 SqlSession 完成 SQL 的解析,参数的映射、SQL 的执行、结果的解析过程;

今天我们就介绍以下第一个阶段中,Mybatis是如何读取配置的

二、配置加载的核心类

==========

2.1 建造器三个核心类


在 MyBatis 中负责加载配置文件的核心类有三个,类图如下:

  • BaseBuilder:所有解析器的父类,包含配置文件实例,为解析文件提供的一些通用的方法;

  • XMLConfigBuilder: 主要负责解析 mybatis-config.xml;

  • XMLMapperBuilder: 主要负责解析映射配置 Mapper.xml 文件;

  • XMLStatementBuilder: 主要负责解析映射配置文件中的 SQL 节点;

XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder 这三个类在配置文件加载过程中非常重要,具体分工如下图所示:

这三个类使用了建造者模式对 configuration 对象进行初始化,但是没有使用建造者模式

的“肉体”(流式编程风格),只用了灵魂(屏蔽复杂对象的创建过程),把建造者模式演绎

成了工厂模式;后面还会对这三个类源码进行分析;

居然这三个对象使用的是建造者模式,那么我们稍后介绍下什么是建造者模式

三、建造者模式

=======

3.1 什么是建造者模式


建造者模式(BuilderPattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

建造者模式类图如下:

各要素如下:

  • Product:要创建的复杂对象

  • Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建;

  • ConcreteBuilder:实现 Builder 接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例;

  • Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;

应用举例:红包的创建是个复杂的过程,可以使用构建者模式进行创建

代码示例:

1、红包对象RedPacket

public class RedPacket {

private String publisherName; //发包人

private String acceptName; //收包人

private BigDecimal packetAmount; //红包金额

private int packetType; //红包类型

private Date Java开源项目【ali1024.coding.net/public/P7/Java/git】 pulishPacketTime; //发包时间

private Date openPacketTime; //抢包时间

public RedPacket(String publisherName, String acce 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 ptName, BigDecimal packetAmount, int packetType, Date pulishPacketTime, Date openPacketTime) {

this.publisherName = publisherName;

this.acceptName = acceptName;

this.packetAmount = packetAmount;

this.packetType = packetType;

this.pulishPacketTime = pulishPacketTime;

this.openPacketTime = openPacketTime;

}

public String getPublisherName() {

return publisherName;

}

public void setPublisherName(String publisherName) {

this.publisherName = publisherName;

}

public String getAcceptName() {

return acceptName;

}

public void setAcceptName(String acceptName) {

this.acceptName = acceptName;

}

public BigDecimal getPacketAmount() {

return packetAmount;

}

public void setPacketAmount(BigDecimal packetAmount) {

this.packetAmount = packetAmount;

}

public int getPacketType() {

return packetType;

}

public void setPacketType(int packetType) {

this.packetType = packetType;

}

public Date getPulishPacketTime() {

return pulishPacketTime;

}

public void setPulishPacketTime(Date pulishPacketTime) {

this.pulishPacketTime = pulishPacketTime;

}

public Date getOpenPacketTime() {

return openPacketTime;

}

public void setOpenPacketTime(Date openPacketTime) {

this.openPacketTime = openPacketTime;

}

@Override

public String toString() {

return “RedPacket [publisherName=” + publisherName + “, acceptName=”

  • acceptName + “, packetAmount=” + packetAmount

  • “, packetType=” + packetType + “, pulishPacketTime=”

  • pulishPacketTime + “, openPacketTime=” + openPacketTime + “]”;

}

}

2、构建对象

public class Director {

public static void main(String[] args) {

RedPacket redPacket = RedPacketBuilderImpl.getBulider().setPublisherName(“DK”)

.setAcceptName(“粉丝”)

.setPacketAmount(new BigDecimal(“888”))

.setPacketType(1)

.setOpenPacketTime(new Date())

难道这样就够了吗?不,远远不够!

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

[外链图片转存中…(img-Cet8TiKT-1650619053415)]

[外链图片转存中…(img-1HhPRJo7-1650619053416)]

[外链图片转存中…(img-wtgMRYAW-1650619053416)]

Myabtis源码分析五-Mybatis配置加载完全图解,建造者模式的使用,涵盖Java各种技术栈相关推荐

  1. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  2. Spring Ioc源码分析 之 Bean的加载(6):属性填充(populateBean())

    "属性填充",也是在populateBean()方法中. 首先回顾下CreateBean的主流程: 如果是单例模式,从factoryBeanInstanceCache 缓存中获取B ...

  3. Spring Ioc源码分析 之 Bean的加载(7):初始化

    接着分析doCreateBean()的第6步--初始化 bean 实例对象 首先回顾下CreateBean的主流程: 如果是单例模式,从factoryBeanInstanceCache 缓存中获取Be ...

  4. Spring Ioc源码分析 之 Bean的加载(4):实例化Bean(createBeanInstance()方法)

    实例化 Bean 在doCreateBean()代码 <2> 处,有一行代码instanceWrapper = createBeanInstance(beanName, mbd, args ...

  5. nhibernate源码分析之六: Criteria数据加载

    ICriteria是使用Expression进行数据加载的接口, 提供了设置表达式(Expression), 排序方式(Order), 分页记录等操作. 它使用一种类似于SQL语句where表达表的方 ...

  6. Spring Cloud Gateway源码系列之路由配置加载过程

    当前章节主要是讲解配置文件中定义的路由配置被gateway加载,同时转为可以直接操作的路由对象 引入pom坐标 <dependency><groupId>org.springf ...

  7. Spring Ioc源码分析 之 Bean的加载(5):循环依赖处理(populateBean())

    首先回顾下Bean加载的主流程: 1.如果是单例模式,从factoryBeanInstanceCache 缓存中获取BeanWrapper 实例对象并删除缓存 2.调用 createBeanInsta ...

  8. MPF源码分析之资源文件加载

    本文将分析MPF客户端框架中资源文件相关的源代码,以github包中提供的qq界面demo作为 起点,一步一步分析程序的运行原理: 主程序很简单,代码如下: int APIENTRY _tWinMai ...

  9. Flume-NG源码分析-整体结构及配置载入分析

    Flume-NG源码分析-整体结构及配置载入分析   弦外之音 很多朋友都在问我,经常看各种框架的源码会不会感到很枯燥,是什么东西在驱动着我一直看下去.其实我想说的很简单,作为一个程序员,不管你工作了 ...

最新文章

  1. 重磅!OpenMMLab 更新啦!分类/检测/分割/3D等项目全面升级
  2. cs python课程 加州大学_B站的CS课程整理 搬运
  3. 重新捡起flask(二)
  4. MyBatisPlus条件构造器排序方法orderByDesc参数怎样构造
  5. minikube配置使用代理
  6. wxWidgets:wxEraseEvent类用法
  7. 【科学计数法模板讲解】1060 Are They Equal (25 分)
  8. 什么叫一年有四季......
  9. 华为服务器系统蓝屏,服务器主机蓝屏
  10. 指针使用c语言,指针的使用(C语言)
  11. 作者:谢华美(1976-),男,中国人民银行征信中心数据部副总经理,主要研究方向为数据挖掘。...
  12. 详谈分布式系统缓存的设计细节
  13. Keras 的预训练权值模型用来进行预测、特征提取和微调(fine-tuning)
  14. nvarchar,nchar,vchar,nvchar,char…
  15. 看数据模型界两大长老的神仙打架
  16. Python:实现simpson rule辛普森法则算法(附完整源码)
  17. reactJS项目搭建
  18. SAP 固定资产期初导入
  19. 粗略的学习一下结巴分词
  20. dubbo整合springboot图解版(九)

热门文章

  1. 支持OneNote for Window10代码高亮工具
  2. String.split()方法介绍
  3. minpack.error: Result from function call is not a proper array of floats.
  4. JetBrains 又出了一款新神器,一套代码适应多端!
  5. 一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码
  6. 爬取通过ajax动态加载的页面(实时监控华尔街见闻资讯与快讯)
  7. oracle ebs 请求 待定,EBS 并发请求 计划 fnd_conc_release_classes(示例代码)
  8. Eslint semi 结尾分号设置与否
  9. 电脑中毒后常见的问题以及防毒的总结
  10. plink做SNP筛选和GWAS