Ibatis(Mybatis)框架之系统架构与映射原理-深入分析Java Web技术内幕

Ibatis通过SQL Map将Java对象映射成SQL语句,将结果集再转化成Java对象,与其他ORM框架相比,既解决了Java对象与输入参数和结果集的映射,又能够让用户方便地手写使用SQL语句。

 

1、Ibatis框架主要的类层次结构

Ibatis主要完成两件事情:

(1)、根据JDBC规范建立与数据库的连接。

(2)、通过反射打通Java对象与数据库参数交互之间相互转化的关系。

 

Ibatis框架的主要的类层次结构图:

图中左边的SqlMapClient接口主要定义了客户端的操作行为,包括select、insert、update和delete。而右边主要定义了当前客户端在当前线程中的执行环境。SqlMapSession可以共享使用,也可以自己创建,但是如果是自己创建的,在结束时必须调用关闭接口关闭session。

 

当使用者持有了SqlMapClientImpl对象,就可以使用Ibatis了。还有一个执行代理类

SqlMapExecutorDelegate。这个类是个工具类,耦合了用户端的执行操作行为和执行的环境,持有执行操作所需要的数据,同时管理着执行操作依赖的环境。

 

2、Ibatis框架的设计策略

Ibatis的主要设计目的还是为了让我们执行SQL时对输入输出的数据的管理更加方便,所以方便地让我们写出SQL和方便地获取SQL的执行结果才是Ibatis的核心竞争力。

 

Ibatis框架的一个重要组成部分就是其SqlMap配置文件,SqlMap配置文件的核心是Statement语句包括CIUD Ibatis通过解析SqlMap配置文件得到的所有的Statement执行语句,同时会形成ParameterMap、ResultMap两个对象,用于处理参数和经过解析后交给数据库处理的SQL对象。这样除了数据库的连接,一条SQL语句的执行条件已经具备了。

 

Statement有关的类结构图:

 

数据映射的大体过程是这样的:根据Statement中定义的SQL语句,解析出其中的参数,按照其出现的顺序保存在Map集合中,并按照Statement中定义的ParameterMap对象类型解析出参数的Java数据类型,根据其数据类型构建TypeHandler对象,参数值的复制是通过DateExchange对象完成的。

 

返回结果ResultMap的映射情况也是类似的,主要是解决SQL语句中的参数和返回结果的列名与Statement中定义的parameterClass和resultClass中属性的对应关系问题。

 

3、Ibatis框架的运行原理

Ibatis运行过程中的主要执行步骤:

图中描述的SqlMapSession对象的创建和释放根据不同情况会有所不同,因为SqlMapSession负责创建数据库的连接,包括对事务的管理,Ibatis既可以自己管理事务又可以由外部管理,Ibatis自己管理是通过共享SqlMapSession对象实现的,多个Statement执行时共享一个SqlMapSession实例,而且线程都是安全的。如果是外部程序管理就需要自己控制SqlMapSession对象的生命周期了。

 

Spring调用Ibatis执行一个Statement的详细时序图:

 

 

4、Ibatis对SQL语句的解析

配置文件中SQL语句如果参数的赋值是”#”包裹的变量名,Ibatis会把SqlMap配置文件解析成一个个Statement,其中包括ParameterMap、ResultMap,以及解析后的SQL。当Ibatis构建好RequestScope执行环境后,要做的就是把传过来的对象数据结合ParameterMap中信息提取出一个参数数组,这个数组的顺序对应于SQL中参数的顺序,然后会调用preparedStatement.setXXX(i,parameter)提交参数(预编译方式防SQL注入)。Ibatis会根据这些变量和parameterClass指定的类型创建合适的dataExchange和parameterPlan对象。parameterPlan对象中按照前面的顺序保存了变量的setter和getter方法列表。

 

5、数据库字段映射到Java对象

根据ResultMap中定义的ResultClass创建返回对象,获取这个对象的所有可写的属性数组。接着根据返回ResultSet中的列名去匹配前面的属性数组,把匹配结果构造成一个集合(resultMappingList),然后选择DataExchange属性、AccessPlan类型为后面的真正的数据交换通过支持。根据resultMappingList集合从ResultSet中取出列对应的值,构成值数组(columnValues),这个数组的顺序就是SQL中对应列名的书序。最后吧columnValues值调用目标对象的属性的setter方法设置到对象中。

这个过程如下时序图:

 

参考书籍:

《深入分析Java Web技术内幕》

相关阅读:

https://blog.csdn.net/zangdaiyang1991/article/details/85054236

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/85158433