学习笔记:分析MyBatis框架-架构与映射

参考文献:《深入分析Java Web技术内幕》 - 第15章

一、MyBatis框架的层次结构

1.1 主要职责:

  • 根据JDBC规范建立与数据库的连接;
  • 通过反射打通Java对象与数据库参数交互之间相互转化的关系;

1.2 处理方式:
典型的交互式框架。先期准备好交互的必要条件,然后构建一个交互环境,在交互环境中划分成会话,每次会话都有一个环境。环境OK之后,就做好交换数据就妥了。

1.3 主要类

  • SqlMapClient:定义了客户端的操作行为,包括select、insert、update、delete。
  • SqlMapSession:定义了当前客户端在当前线程中的执行环境。可以共享使用,也可以自己创建,如果自己创建,结束时必须调用关闭接口进行关闭。
  • SqlMapExecutorDelegate:执行代理类。耦合了用户端的执行操作行为和执行环境,它有执行操作的所需要的数据,同时管理着执行操作以来的环境,可以看错是一个工具类。

二、MyBatis框架的设计策略

2.1 设计目的:
为了让开发者在执行SQL时对输入输出的数据的管理更加方便。
核心竞争力:方便的写出SQL和方便的获取SQL的执行结果。

2.2 SqlMap配置文件:
MyBatis框架的一个重要组成部分就是SqlMap配置文件,其核心是Statement语句。
MyBatis通过解析SqlMap配置文件得到所有的Statement执行语句,同时会形成ParameterMap、ResultMap两个对象,用于处理参数和经过解析后交给数据库处理的SQL对象。

2.3 Java类型到数据库类型的转换
数据映射的过程:根据在Statement中定义的SQL,解析出其中的参数,按照出现的顺序保存在Map集合中,并按照在Statement中定义的ParameterMap对象类型解析出参数的Java数据类型,根据其数据类型构建TypeHandler对象。

三、MyBatis框架的运行原理

首先,构建MyBatis的工作环境:
读取SqlMap配置文件,构建Statement对象集,创建SqlClient对象。这三步结束就把环境构建好了。接下来是整个过程的执行步骤。
Statement → 1**创建SqlMapSession**对象 → 从对象池里取出一个SessionScope对象 → 建立数据库连接 → 从对象池中取出一个RequestScope对象执行SQL语句 → 映射Java对象参数到ParameterMap&映射数据库列名ResultMap归还RequsetScope对象到对象池 → 释放数据库连接 → 归还SessionScope对象那个到对象池 → 销毁或共享SqlMapSession

四、MyBatis对SQL语句的解析

上文提到,MyBatis会把SqlMap配置文件解析成一个个Statement,其中包括ParameterMap、ResultMap,以及解析后的SQL。MyBatis构建好RequestScope执行环境后,就要将传过来的对象数据结合ParameterMap中的信息提取出一个参数数组,这个数组的顺序对英语SQL中参数的顺序,然后调用prepare额度Statement.setXXX(i,parameter)提交参数。
以上所说的解析,是指使用“#”形式指明参数,解析出来的sql中参数被“?”替换。(使用“#”指明参数,可以防止sql注入)

mybatis中的#和$的区别
#相当于对数据加上双引号,$相当于直接显示数据。

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
  2. sqlorderby user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
  3. #方式能够很大程度防止sql注入
  4. $方式无法防止Sql注入
  5. $方式一般用于传入数据库对象,例如传入表名
  6. 一般能用#的就别用$
  7. MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

猜你喜欢

转载自blog.csdn.net/v_axis/article/details/78901379
今日推荐