写点什么

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

  • 2022 年 4 月 22 日
  • 本文字数:2828 字

    阅读完需:约 9 分钟

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<TUser> 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、博客、掘金等网站上分享技术,这也是一种学习的方法。


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





用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Myabtis源码分析五-Mybatis配置加载完全图解,建造者模式的使用,涵盖Java各种技术栈_Java_爱好编程进阶_InfoQ写作社区