MyBatis 源码解读(零)导语

简单介绍下我使用最多的持久层框架 Hibernate valuelist MyBatis 这三个框架,也是用过国内的一些产品,不过已经很少了。

虽然已经使用了很长时间,但是还没有认真的读过该项目的源码,不读一下总感觉有点遗憾,为此写出了该系列的博文,能力有限,不足或纰漏之处希望读者指正。

以下是对我常用的持久层框架的简单对比,不喜欢的可以忽略以下内容

Hibernate

Hibernate 是我最早使用,曾经也是我十分热爱的框架 :

首先说这个框架的主旨思想是要从开发人员的思维中把表这一概念隐去,只保留对象的概念。到现在我还一直认为这是一个非常先进的理念,这样有一个非常明显的好处,就是可以让开发人员更专注于业务,不考虑与数据库交互的过程。

但是就是她的思想太先进了,实际上到目前为止,与数据的交互一直是一个瓶颈,无论怎么做都不能实现几乎无延迟的数据检索与写入,Hibernate要做到好用就必须与数据产生大量的交互,截止到现在我们在数据存储和检索方面还做不到接近于无感知,而且可以断定在将来相当长的一段时间内也不太可能做得到。

要解决这一问题就必须使用手写SQL 一旦使用手写SQL,这就已经不是 Hibernate的优势了,Hibernate 手写SQL时还是相当的繁琐的,而且不方便修改,这对开发人员来说是很不友好的事情。

MyBatis

我使用最多, 也是目前为止我最喜欢的一个框架,原因就是他实用,方便快捷。使用MyBatis时通常我们需要定义一个Mapper 每一个Mapper对应一个相应的 xml 文件,由框架处理 JAVA 代码与 XML 文件之间的联系,这样激活就可以实现JAVA代码和SQL开发的独立执行,调试SQL再也看不见烦人的 “” 和字符串拼接了。

下面是一个Mapper的示例文件

<?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.pos.mapper.PosMapper" >
   <select id="findByAgentNo" resultType="com.pos.entity.Agent">
   	select
       a.id id,
       a.agent_no agentNo,
       a.short_name shortName,
       a.full_name fullName,
       a.sales sales,
       a.status status,
       sale.staff_no ,
       sale.staff_name ,
       a.role_type roleType,
       a.create_time createTime
   from user a
        left join staff sale on a.sales = sale.staff_no
   where a.agent_no = #{agentNo}
   </select>
</mapper>	

从以上的代码中可以看出,除了标签之外,几乎完整的保留了一个完整的SQL格式,可以直接在SQL编辑器中进行调试SQL,十分方便。

valuelist

valuelist ,这个框架可能对很多人来说比较陌生,不做过多介绍了,简单和 MyBatis对比一下

MyBatisvaluelist
SQL编写简单,可在SQL编辑器中直接使用简单,可在SQL编辑器中直接使用
SQL调用简单,对应的命名空间即为对应的JAVA类,通过正常的工具即可进行大量的代码提示不需要硬性记忆麻烦,调用时必须明确的知道自己调用的SQLkey值是多少,这个是不能通过开发工具进行提示的
数据库记录与对象的映射框架完成,非常方便快捷需要自己进行手工适配
分页操作不提供默认分页功能,需要自己书写相关代码或者使用插件默认带有分页功能,分页比较方便
SQL查找方便程度方便,通常我们的文件名称与对应的类名一致,文件为xml格式,通过命名空间进行隔离从JAVA查找SQL方便,在合理规范名称下,可方便查找对应的文件中的SQL;在逆向进行查找的时候很不方便,不能很快的锁定调用关系

通过对比可以发现只有在需要分页时valuelist 稍微占优,但是MyBatis的生态中已经存在很好使用分页插件,引入后只需要简单的几行代码便可实现一个非常优秀的分页功能。我使用的是 PageHelper,你可以在Github 获取相关信息引入项目使用。

MyBatis是一个开源的持久层框架,它的配置文件包含了会深深影响MyBatis行为的设置和属性信息。配置文件的顶层结构包括properties(属性)、settings(设置)、typeAliases(类型别名)、typeHandlers(类型处理器)、objectFactory(对象工厂)、plugins(插件)、environments(环境配置)、mappers(映射器)等。\[3\] 在MyBatis源码中,有一个方法build,该方法用于解析动态脚本并生成SqlSource对象。在该方法中,首先会调用parseDynamicTags方法解析动态标签,得到一个包含多个SqlNode的列表contents。然后,通过将contents传入MixedSqlNode的构造函数,创建一个MixedSqlNode对象rootSqlNode。接下来,根据是否为动态脚本,分别创建DynamicSqlSource或RawSqlSource对象,并将configuration、rootSqlNode和parameterType作为参数传入构造函数。最后,返回创建的SqlSource对象。\[2\] 另外,还有一个方法configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql),该方法用于创建StatementHandler对象。具体的解读需要查看该方法的实现代码。 #### 引用[.reference_title] - *1* [mybatis源码深度解析](https://blog.csdn.net/qq_31359923/article/details/126582701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [【MybatisMybatis源码解读](https://blog.csdn.net/keepfriend/article/details/124356649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [mybatis源码解析](https://blog.csdn.net/weixin_43189971/article/details/125418419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚定的小辣鸡在努力

你的支持是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值