【手搓mybatis-3】mapperXML解析及装配

mybatis这种ORM框架的基本目标,其实就是给指定的接口(Dao)提供代理类。
这个代理类的方法可以基于对应的 mapper xml 文件中的配置 进行数据库的操作。

之前我们已经实现了:

  • 通过包扫描自动对Dao包下的接口进行Mapper注册,得到MapperRegister;
  • 通过SqlSession工厂创建SqlSession,将MapperRegister提供给了DefaultSqlSession
  • 通过SqlSession获取到代理对象

但是调用SqlSession获取到的代理对象的方法还不能对应到具体的数据库操作实现

我们知道mybatis是通过mapper.xml文件对每一个Dao的数据库功能进行描述的,本节就进行Mapper.xml文件的解析和注册使用,使得调用代理对象的方法可以获取到代理对象对应mapper.xml文件中配置的sql语句:

今日实现

1. 封装xml解析结果对象

我们知道SqlSession是用来表示与数据库的一次交互,是管理数据库操作的接口,也就是SqlSession是负责将传递来的SQL操作进行执行的,可以算是基础设施层。

对Mapper的解析结果其实保存在全局的Configuration中,具体来说,mapper注册机映射和Sql语句映射分别保存在 MapperRegistry 和 MapperStatement 中。

  • MapperRegistry:解析出mapper.xml文件中配置的Dao文件路径,通过addMapper(路径)将对应mapper注册进mapperRegistry
  • MappedStatement:封装了映射的 SQL 语句,还包含了执行这些 SQL 语句所需要的完整元数据,比如SQL类型(select、insert…)、入参类型、出参类型、结果映射等;

接下来要做的就是将Mapper.xml文件中每一个方法解析成一个MappedStatement,在全局的Configuration中用 的Map 保存方法id到SQL封装对象的映射,解析出来的SQL封装对象都保存在这里面。

2. 基于SAX和Dom4j进行XML解析

mybatis源码是使用了 Java 标准库中的 XPath(一种XML查询语言) 和 SAX (Simple Api for XML)解析器进行简单场景的xml解析,而针对一些复杂的XML场景,用到的也是DOM4J

Dom4j 是一个开源的 Java 库,专门用于处理 XML 文档。它基于 Java 的 XML 解析标准设计,具有高效、灵活、易于使用的特点,广泛应用于 Java 应用程序中处理 XML 的场景。Dom4j 可以用来解析、生成、修改 XML 文档,并支持 XPath、XSLT 等高级 XML 技术。

这一部分我们在 XMLConfigBuilder 中进行解析,注册每个mapper,并装配出每个方法对应的MappedStatement,add进Configuration的MappedStatement;

SAX v.s.DOM4J

关系:SAX 是事件驱动的解析方式,DOM4J 是基于树结构的解析库,DOM4J 提供了对 SAX API 的支持。而 XPath 是一种查询语言,通常与 DOM4J 结合使用。

虽然 DOM4J 本身是基于 DOM 树结构的解析库,但它也可以使用 SAX 解析器作为底层解析机制——使用DOM4J提供的 SAXReader 类来解析 XML 文档,并且它实际上是基于 SAX 解析器的。这意味着在使用 DOM4J 时,底层的 XML 解析工作可以通过 SAX 来完成,但解析结果是一个 DOM4J 的文档对象模型,而不是基于流式的 SAX 事件处理。

3 映射器 sql命令缓存

一个 mapperProxy 对应一个Dao接口

到目前为止的流程图

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇