Mybatis框架结构
创始人
2025-05-29 02:07:13
0

在学习mybatis之前,首先回忆传统jdbc如何访问数据库。传统jdbc 访问数据库首先需要导入驱动jar包,然后在后端的持久层进行访问数据库,具体步骤为:

  1. 注册驱动。根据不同的数据库注册不同的驱动,例如mysql、oracle等

  1. 获取数据库连接。获取连接是利用DriverManage生成Connection类型连接。在此处需要填写数据库的账号密码和地址。

  1. 定义Sql语句。例如在此处编写好字符串类型的增删改查Sql语句。

  1. 获取执行Sql对象。执行sql语句的是Statement对象,而获取Statement对象是通过第二步的Connection获取。Mybatis其本质也是通过Statement操作数据库。但是Mybatis与传统jdbc不同,不同在于不需要重复的申请数据库连接。

  1. 执行sql语句。执行sql语句是利用Statement对象执行,Statement对象有executeQuery、executeUpdate 和execute。executeQuery执行数据库查询,executeUpdate 执行数据库增删改。Mybatis底层依旧使用的是这些方式操作数据库。

  1. 接受返回集,处理数据,关闭连接。

不同于传统jdbc,Mybatis是将传统jdbc进行封装,例如传统jdbc第1、2步,只需要配置xml文件即可,同时编程人员操作数据库时不同频繁的操作java类,使编程人员从底层重复代码中脱离出来,更多的关注程序的逻辑实现。对于Mybatis,它更多采用了配置xml文件的形式操作数据库和配置自己。与传统jdbc执行步骤相比,Mybatis具体的执行流程如图1。

图1 Mybatis执行流程

  1. 在MyBatis启动的时候,主要任务是解析配置文件。配置文件来源于全局配置文件(Mybatis-config.xml)、映射器配置文件(Mapper.xml),Mapper.xml包含如何控制MyBatis的行为和Sql语句,以及入参类型,返回值映射。解析配置文件后,程序会把这些信息解析成一个Configuration对象,由Configuration统一管理配置信息。

  1. 在程序调用数据库操作的时候,Mybaits它在应用程序和数据库之间建立连接,就是创建了SqlSession对象。SqlSession对象由会话工厂SqlSessionFactory创建,SqlSessionFactory包含所有的配置信息,在容器初始化的时候由SqlSessionFactoryBuilder创建。此处可以类比传统jdbc中的Connection,只是获取了数据库连接,但是并未向数据库发出具体的执行语句指令。

  1. 在执行数据库操作的时候,SqlSession将具体操作委托于Executor对象,由Executor执行操作。在此处Executor会解析Sql语句,Executor对象利用StatementHander操作动态Sql,将参数等与动态Sql结合,生成可执行的Sql语句。同时也将在这里完成结果集映射,将数据库中的字段与java类一一对应。此处对应传统jdbc操作的c、d、e步骤。

从上文的步骤可以发现,在实际的开发中,我们只需要关注配置文件和编写少量的Sql语句即可以完成操作数据库。并且在返回值类型中,以封装对象的形式存在,方便了我们的日常开发。从Mybatis执行流程也可以发现,整个Mybatis的执行流程从SqlSession开始,到StatementHande结束,与程序员接触的只是SqlSession接口。SqlSession是每个mapper.xml文件共有的数据会话接口,也即即使有很多mapper.xml文件,而SqlSession只有一个。也区别与传统的jdbc,每一次访问数据库都需要创建新的数据库连接,而造成的资源浪费。

依靠Mybatis 的执行流程,Mybatis 框架结构可以总结为如图2所示。

图2 Mybatis框架结构

Mybatis 框架结构大体与执行流程相类似。 Mybatis有众多优点,其中最重要的是节约资源,原生jdbc除了代码大量复写的缺点,最大的缺点是与数据库连接的重复申请,造成了数据库资源的浪费。在节省资源方面,Mybatis采用了数据库连接池,数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,这项配置在Mybatis中也有明显的体现。另外,Mybatis也采用了缓存机制,将频繁访问的数据存放到缓存中,避免了重复访问数据库。

Mybatis 是操作数据库的框架,数据的安全是很重要的。Mybatis 提供了数据库防注入的措施。数据库注入是常见的数据库安全问题,原因是在sql语句预编译阶段插入了其他sql语句,导致数据库执行了错误指令。在Mybatis 里,通过底层实现预编译而避免发生数据注入,具体用法是#和$的区别。#在底层通过prepareStatement预编译实现类对当前传入的sql进行了预编译,避免错误指令产生。而$首先进行字符串拼接,再进行编译,如此就容易产生数据注入。

相关内容

热门资讯

南京中央商场收警示函,涉诉讼未... 11月21日,根据江苏证监局发布的决定,南京中央商场(集团)股份有限公司及其相关责任人祝珺、李尤、金...
张明:英国养老金体系——改革历... 张明系中国社会科学院金融研究所副所长、国家金融与发展实验室副主任、中国首席经济学家论坛理事 注:本文...
化解陈年旧债 卸下纠纷“包袱” 图为广西壮族自治区贺州市平桂区人民法院沙田人民法庭庭长蒙明双对易大姐进行判后答疑。 罗媚娟 摄 “蒙...
市人大代表建议优化上海外牌限行... 在长三角一体化的大背景下,城市交通管理政策对于区域经济发展和人员流动具有重要影响。上海市人大代表朱柯...
2025年11月化工专利律师,... 在当今竞争激烈的商业环境中,知识产权的保护对于化工、生物等行业以及拟上市企业来说至关重要。选择一位靠...
法律顾问能处理海事海商法律事务... 法律顾问能否处理海事海商法律事务 在当今复杂的商业环境中,海事海商活动频繁,其中涉及的法律问题错综...
“一口价”,为啥会引发纠纷? 新华视点 | 网约车“一口价”:“司乘两难”如何解? 近期,多地针对网约车低价竞争乱象,发布暂停“一...
原创 中... 联合国的最新表态令人精神一振,这种明确态度其实本就顺理成章。台湾自古属于中国,这是铁一般的事实,中国...
花800元就能买自己的死亡证明... 花800元就能买到 本人的精神诊断报告和死亡证明? 近日,“假证定制”业务 在多个电商和社交平台 死...
智能平台支撑政策落地 实达集团... 11月17日,福建省发展和改革委员会网站发布《福建省数据管理局关于印发〈福建省数据流通交易管理办法(...