MyBatis源码解析一

时间:2022-07-22 17:19:41

1.MyBatis解决了什么问题


1.DataSource    ---   数据库连接池
解决问题:
1.数据连接频繁开启、关闭,使用连接池解决资源浪费问题
2.解耦合,统一从DataSource中获取数据库连接,DataSource的具体实现让用户去定义

2.Configuration --- SQL统一存取,加载
解决问题:
1.SQL统一集中放置到配置文件中(以Key-Value格式存放)
2.通过SQL语句的key值去获取对应的SQL语句

3.传入参数映射和动态SQL
解决问题:
解决传递参数时,数量和位置不对映,动态SQL无法统一处理问题!!!

1.通过类似JSTL的if else标签,使用专门的SQL解析器来解析这样的SQL语句
2.动态SQL,根据条件判断,匹配对应的参数和值,生成最终执行的SQL
3.占位符: 使用 #变量名 表示占位符变量
使用 $变量名 表示非占位符变量

4.MappedStatement --- 结果映射和结果缓存
解决问题:
1.封装了结果处理,得到结果集后,直接调用封装的方法即可得到结果映射
2.对执行结果的一些处理方式:
转成一个JavaBean对象返回,一个Map返回,一个List返回,一个Long或Integer返回等
前提:
告诉SQL处理器:
1.返回什么类型对象
2.需要返回的对象的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上

5.解决重复SQL语句问题
解决问题:
1.合并类似的重复SQL (eg:查询时,有时只是查询字段或where条件不同,其他都一样)
2.将重复的SQL抽离成一个SQL模块块,然后在各个需要使用的地方引用


6.MyBatis对JDBC的优化和封装总结:

(1) 使用数据库连接池对连接进行管理

(2) SQL语句统一存放到配置文件

(3) SQL语句变量和传入参数的映射以及动态SQL

(4) 动态SQL语句的处理

(5) 对数据库操作结果的映射和结果缓存

(6) SQL语句的重复


7.MyBatis有待改进之处
问题:
MyBatis所有DB操作都是基于SQL语句的,导致什么样的DB操作都要写SQL,一个系统要写的SQL太多???
改进:
对数据进行的操作,大部分是对表数据的增删改查,很多是对单表的数据操作!!!
通过反射可以获取到对应的表结构,拼凑成SQL语句即可
实际改进应用:
MyBatis-Generator --- 生成单表的通用操作语句!!!


2.MyBatis架构设计

引言

主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络。后面文章我们再详细讲解各个组件。

 

2.整体设计

2.1 总体流程

(1)加载配置并初始化

      触发条件:加载配置文件

      配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

      

(2)接收调用请求

      触发条件:调用Mybatis提供的API

      传入参数:为SQL的ID和传入参数对象

      处理过程:将请求传递给下层的请求处理层进行处理。

          

(3)处理操作请求

       触发条件:API接口层传递请求过来

       传入参数:为SQL的ID和传入参数对象

       处理过程:

        (A)根据SQL的ID查找对应的MappedStatement对象。

        (B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。

        (C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。

        (D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。

        (E)释放连接资源。

       

(4)返回处理结果

将最终的处理结果返回。

 

2.2 功能架构设计MyBatis源码解析一

功能架构讲解:

我们把Mybatis的功能架构分为三层:

(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

 

2.3 框架架构设计

MyBatis源码解析一

 

框架架构讲解:

(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

(3) SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。


MyBatis源码解析一

原理详解:

        MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。