ibatis 核心原理解析,年薪70万在线教你!

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码。虽然最后证明问题的原因与 ibatis 无关,但是这个过程加深了对 ibatis 框架原理的理解。


这篇文章主要就来讲讲 ibatis 框架的原理。


可能现在很多人已不再使用 ibatis 或者说也没听 ibatis,不过肯定了解过 Mybatis。ibatis 就是 Mybatis框架的前身,虽然 ibatis 框架已经比较老,但是其核心功能与 Mybatis 一致。


 ibatis 解决的痛点


我们先看一个使用 JDBC 查询的例子。


640?wx_fmt=png


使用原生 JDBC 查询,存在两个痛点:


1. 使用非常繁琐,且需要处理各种数据库异常,并且还需要关闭各种资源。

2. 数据转化麻烦。查询之前需要从 Java 对象属性值设置到  PreparedStatement  中,查询返回之后又需要从 `ResultSet`获取返回设置到返回对象中。


在 ibatis 中封装这些繁杂数据库连接查询代码,并处理了各类异常以及关闭各种资源。另外 ibatis 自动处理 Java 对象与数据库类型之间的自动转化,让业务代码与 SQL 代码之间做到了解耦。


数据类型转化原理


数据类型转化主要分为两类,一,传入查询的 Java 对象数据转化成 SQL 类型数据。二 查询返回的数据库信息映射到 Java 对象中。


ibatis SQL 需要定义在配置文件中,一个查询 SQL 语句配置如下:

  <select id="queryName" parameterClass="com.query.QueryDO"  resultClass="com.query.QueryDO" >	
    select  * from  TEST_QUERY where ID=#id#	
	
      </select>

ibatis 框架启动过程将会解析配置文件,生成  MappedStatement 的子类。如 select 配置会生成对应的 SelectStatement 对象。


MappedStatement 相关类图如下。


640?wx_fmt=png


在  MappedStatement 中将会保存存在两个重要的对象,ParameterMap ResultMap,通过这两个对象将会完成 Java 类型与数据库类型的相互转化。


Java 对象转化成数据库类型


以上面 select 配置为例,我们这里需要做的是从传入的 com.query.QueryDO 对象中获取属性值,然后通过 PreparedStatement.setxx 设置到查询参数中。


ibatis 解析配置中 SQL 语句时,将会获取 # 之间的内容,将其替换成 ?。然后按照顺序保存到一个 ParameterMapping[] 数组中,这个数组将会保存到 ParameterMap 对象中。


ParameterMapping 将会保存解析字段相关信息。


640?wx_fmt=png


最终解析后的 SQL 为:


select  * from  TEST_QUERY where ID=?


该 SQL 就可以通过  connection.prepareStatement("select * from  TEST_QUERY where ID=?"); 生成 PreparedStatement 对象。


接着 ibatis 会根据 ParameterMapping parameterClass 指定的类型创建合适的 dataExchange parameterPlan 对象。


其中 parameterPlan 对象会按照 ParameterMapping 数组中顺序保存了变量的 setter 和 getter 方法数组。


dataExchange 会按照 ParameterMapping  数组中的顺序使用反射获取 parameterPlan getter 方法返回值生成 parameters 数组。


最后循环 ParameterMapping 数组,在 TypeHandler 调用  PreparedStatement.setxx 设置相关值。


640?wx_fmt=png


TypeHandler 存在很多子类,通过这些子类正确处理了 Java 对象与数据库类型转化。


转化的时序图为:


640?wx_fmt=png


时序图来源于:https://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/index.html


数据库字段映射到 Java 对象


SQL 执行结束之后将会返回查询结果,这里将会使 SQL 查询结果转化为返回结果 com.query.QueryDO。这里需要用到上面提到 ResultMap  对象。


当 SQL 执行结束返回 ResultSet 对象之后,使用 ResultSet.getMetaData() 获取返回信息元数据对象 ResultSetMetaData


ResultSetMetaData 可以获取返回结果字段名,类型等信息,然后按照顺序存入 ResultMapping 数组中。


然后按照 ResultMapping 数组中使用 TypeHandler调用 ResultSet.getxx 获取实际返回数据,保存到 columnValues 数组中。


ResultMap 对象会根据  ResultMapping 与 resultClass指定的类型合适的 dataExchange resultPlan对象。resultPlan对象与上面的  parameterPlan 对象一样也会保存着变量的 setter 和 getter 方法数组。


最后先根据 resultClass 反射生成返回对象,然后使用反射调用 resultPlan  setter 方法,依次设置相关值。


映射返回对象时序图为:


640?wx_fmt=png



时序图来源于:https://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/index.html


ibatis 样板代码


上面讲完了 ibatis 数据类型的转化原理,接着我们来看下 ibatis 调用 JDBC 样板代码。 


使用 ibatis 执行查询语句时,如 queryForObject ,调用到 SqlMapExecutorDelegate  。在  SqlMapExecutorDelegate  中将会会做一些前提准备,比如准备事务,最后会将 SQL 语句委托给 SqlExecutor 执行。


640?wx_fmt=png


这里使用委托者模式,接受请求的对象将请求委托给另一个对象来处理。这种模式的优点在于解耦了业务代码与实际执行代码的联系,在于对外隐藏真正执行对象,易于扩展。


SqlExecutor#executeQuery  执行过程主要分为以下三步。


640?wx_fmt=png


第一步,获取 PreparedStatement,使用 conn.prepareStatement(sql) 获取。


640?wx_fmt=png


第二步调用 PreparedStatement.setxxx 方法设置参数。上文中的 Java 对象类型转化成 SQL 类型在这里完成。


第三步,调用 PreparedStatement.execute() 执行 SQL 语句。


第四步,使用 ResultSet 获取返回值,在这一步将会完成 数据库类型与 Java 类型的转化。


帮助链接


References

[1] 深入分析 iBATIS 框架之系统架构与映射原理: https://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/index.html


End


如有收获,请帮忙转发,您的鼓励是作者最大的动力!

640?wx_fmt=png


640?wx_fmt=jpeg

我是本周的小编「」,现在要隆重地告诉大家一个好消息,对于加入「Java极客技术」知识星球的同学提供基本的福利:


文章有疑问的地方可以提问,其他工作问题都可以提问出来,作者免费作答。

 https://t.zsxq.com/Y3fYny7


每周都有大牛分享一些面试题,和面试注意的知识点!

 https://t.zsxq.com/2bufE2v


每周由Java极客技术独家编制的设计模式与大家分享!

 https://t.zsxq.com/3bUNbEI


每两周还会分享一个话题,和大家一起成长!

 https://t.zsxq.com/BI6Unm2


还有Java极客技术团队亲自录制了一套 Spring Boot 视频,这套视频加密,加密后放到云盘上,下载链接加密之后,一机一码,每个星球的用户一个播放授权码。

 

我们做知识星球的目的和其他星主一样,就是为了帮助大家一起更好的成长,与高手拉近距离,减少差距,其实你也是高手!

640?wx_fmt=png640?wx_fmt=jpeg640?wx_fmt=jpeg640?wx_fmt=jpeg640?wx_fmt=jpeg

1000人,50元/每年,现在大约还剩407名额。

长按二维码


640?wx_fmt=png


640?wx_fmt=png



欢迎长按下图关注公众号Java极客技术,后台回复“资料”,获取作者独家秘制精品资料

640?wx_fmt=other

Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。



640?


Win10家庭版中文用户名改英文全攻略:从注册表到环境变量一步不落 本文详细介绍了Windows 10家庭版中文用户名改为英文的完整流程,包括注册表编辑、环境变量调整等关键步骤。通过激活管理员账户、重命名用户文件夹、修改注册表键值等操作,彻底解决因中文路径导致的软件兼容性问题,并提供常见错误解决方案和系统维护建议。 阅读详情

相关推荐

LeRobot X-VLA:首个适用于任意机器人、任意任务的软提示机器人基础模型

X-VLA是一种基于软提示的视觉-语言-动作模型,通过可学习嵌入向量编码不同机器人配置,实现跨平台统一控制。该框架采用两阶段训练:先在29次多平台任务中学习通用策略,再通过微调少量参数(仅1%)适配新机器人。实验表明,0.9B参数的X-VLA在6个仿真和3个真实平台上表现优异,如LIBERO任务达93%成功率,布料折叠任务100%完成。其核心创新是将硬件差异视为"任务",用软提示引导Transformer处理异构数据,为机器人基础模型提供可扩展方案。

2506_90492529的博客 1200

Ibatis中的枚举类型和数据库中int类型可以自动转换

Ibatis中的枚举类型和数据库中int类型可以自动转换1、执行Insert的操作时,Ibatis可以将枚举类型转换成int类型2、执行Select的操作时,Ibatis可以将数据库中int类型自动转换为枚举类型转载优特建站:http://www.youtiy.com/Articles/Item.aspx?Id=193 转载于:https://blog.51cto...

weixin_34233421的博客 346

第一章:Profibus DP通信简介

PROFIBUS (Process Fieldbus)的缩写,是一种国际化的、开放的、不依赖于设备生产商的现场总线标准。它广泛应用于制造业自动化、流程工业自动化和楼宇、交通、电力等其他工业自动化领域。串行现场总线主要用来连接数字现场设备或中、低功能的系统,如传感器、执行机构、变送器、可编程序控制器(PLC)、数控装置(NC)、编程设备、本地人机接口等。

qq_22560021的博客 4828

ibatis 学习

insert,update,delete 返回值 insert 返回的为插入的主键值,但必须在配置文件中加入&lt;selectKey/&gt;    如果主键值为String     &lt;selectKey resultClass="String" keyProperty="resourceId" &gt;         &lt;![CDATA[               selec...

困难户 164

java mybatis_Java开发之Mybatis获取数据的实现方式

前言SSM是web开发常用的开发框架(Spring、Struts、Mybatis),另外一种组合是Spring+SpringMVC+Mybatis。Spring使用基本的JavaBean,是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Struts通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)...

weixin_42355744的博客 537

ibatis中属性读取的一个知识点

ibatis 在读取javabean的属性时支持 isProperty()的方式,即如果在javabean中有这个属性时,在ibatis的配置文件中可以使用javabean.propery进行读取,效果和getProperty()一样。 配置文件中iterate标签可以迭代实现了iterable接口的元素,因此可以迭代collection集合和数组,如果在java中可以结合不定参数来设计接

黄刚的专栏 1202

iBatis SqlMap的配置总结

zt:https://blog.csdn.net/wwwtotoro/article/details/71699575 核心提示:SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: sqlMap namespace=Account,在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: typeAlias alias=...

起风了 294

marimo Accordion 组件详解:用 `mo.accordion` 构建可折叠内容区

本文围绕 marimo 的 `mo.accordion` 布局组件展开,讲解如何用 Python 字典快速构建可折叠的内容面板,用于收纳长文本、Markdown 说明、图表与表格等输出,让 Notebook 界面更紧凑。读完本文,你将掌握 `mo.accordion` 的全部参数(`multiple`、`lazy`)、Markdown 内容写法、与 `mo.lazy` 的懒加载配合,以及其在前端与

gitblog_00012的博客 68

iBATIS.NET 学习记录

一、资料部分 iBATIS主页:http://www.mybatis.org/ Anders Cui博客园iBATIS.NET小组:http://space.cnblogs.com/group/ibatis/ 入门资料:http://blog.csdn.net/fangxinggood/archive/2010/03/15/5383644.aspx ...

weixin_30262255的博客 163

iBatis2 SqlMap中常用sql语句

本来我也不喜欢iBatis,那是因为我当时还不怎么会用它,现在我想说,iBatis是个好东西,不信你试试看。下面是我在项目实践中对iBatis的一个小总结,希望帮助众多在疲于iBatis编码而无暇思考的苦工们找到一些偷懒的机会。   SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间:   ,在此空间外要引用此空

cqboy1991的专栏 2109

企业级iBATIS到MyBatis平滑迁移:自动转换工具的技术决策指南

在技术栈演进的道路上,iBATIS到MyBatis的框架升级是企业级应用现代化改造的关键一步。iBatis2MyBatis转换工具为技术决策者提供了一个高效、低风险的迁移解决方案,通过自动转换显著降低技术债务,实现企业级应用的平滑升级。 ## 技术迁移的战略价值 🎯 对于长期使用iBATIS 2.x版本的企业应用,技术迁移不仅仅是框架替换,更是技术债务清理和系统现代化的战略决策。iBATI

gitblog_00307的博客 62

iBatis之SqlMap配置总结

SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间:   ,在此空间外要引用此空间的元素,则需要加上命名空间名。   2、实体的别名:     如果有用到的全名的地方,可以用别名代替,受命名空间约束。   3、插入操作     对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。   4、获取主键

虎子专栏 2132

ibatis快速入门(三)

http://my.oschina.net/zimingforever/blog/99374 很久没做ibaist的系列的东西了,昨天正好在组里分享了一下,所以就顺手把内容再重新整理一下 首先附一下ibatis的源码包,由于ibaits改成了mybatis,所以官网都很难下到了源码,感谢这个博主的分享 http://yizhilong28.iteye.com/blog/85008

子豪专栏 1187

ibatis sqlMap 使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34315189的博客 556

ibatis使用总结

SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。   1、命名空间:   ,在此空间外要引用此空间的元素,则需要加上命名空间名。   2、实体的别名:     如果有用到的全名的地方,可以用别名代替,受命名空间约束。   3、插入操作     对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。   4、获取主键  

笨鸟快飞的专栏 704

iBatis SqlMap 的配置总结

核心提示:SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: sqlMap namespace=Account,在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: typeAlias alias=Account type=com.lavasoft.ibatissut.sim SqlMap的配置是iBatis

噬魂归来的专栏 865

ibatis sqlmap配置

SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间:   &lt;sqlMap namespace="Account"&gt;,在此空间外要引用此空间的元素,则需要加上命名空间名。   2、实体的别名:   &lt;typeAlias alias="Account" type="com.lavasoft.ibatissut.simple...

John_Kong19的专栏 187

ibatis 配置总结

核心提示:SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: sqlMap namespace=Account,在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: typeAlias alias=Account type=com.lavasoft.ibatissut.sim SqlMap的配置是iBatis

zhangweikai的专栏 1119

iBATIS SQLMap的配置

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34148340的博客 87
上一篇: 别说了,我要学网络编程(一)
下一篇: 喂,恶臭青年,你还想继续单身?今天特别福利来袭,出来挨打!
javageektech
博客等级 码龄7年 300粉丝 433原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值