声明:
Author:赵志乾
Date:2018-6-24
Declaration:All Right Reserved!!!
背景知识:
1、JDBC同数据库管理系统的对接JDBC规范提供了一套API,对上供应用层调用,对下供数据库供应商的数据库驱动程序进行对接。这套API通过桥接模式实现应用和数据库关系系统的链接,链接后需要向数据库管理系统发送接入信息,通过验证后,方可实现真正的贯通。虽然通过JDBC搭建了一条通道,但Java应用依然是不能操作数据库,因为两者的语言是不通的,所以Java应用需要将能够操作数据库的sql语句通过这条通道发送给数据库管理系统来执行,进而达到间接操作数据库数据的目的。
2、sql语句生成
Java应用通过JDBC向数据库管理系统发送sql语句来操作数据库数据,也就意味着sql语句是在Java应用中生成。其生成方式主要有以下两种:用字符串表示固定的sql语句,通过代码实现sql语句的拼接。实际应用中,很多sql语句都要求依据传入的具体参数值来决定的,也就是说要使用代码来拼接sql语句,这将会导致代码中充斥这一大坨判断语句。
3、MyBatis动态SQL语句
MyBatis作为一个成熟的ORM框架,其通过在映射器中引入3个元素来表征拼接SQL语句的意图。而在其框架代码中,会解析这些元素且保存到配置对象中,并在有调用请求到达时,依据传入的参数和原先解析的动态拼接元素自动拼接成所需的SQL语句。
if元素
1、应用场景:
映射器中用于对应SQL语句的主要有增删改查4个元素,其中而if元素更多的是用于其中的查询元素select。因为查询用的条件通常不止一个(通常会使用多个字段),而且这些条件需要依据传入的参数来拼接SQL语句。
2、test属性
if元素用于选择,就必然需要有选择的标准。这一标准用该元素的test属性来表征选择。test属性的值是一个字符串,其在映射器文件被解析时,会被收入内存。调用请求一旦到达,框架便会取出请求参数和该字符串放入ONGL表达式引擎做估值计算。然后,依据计算结果选择是否拼接if元素的文本内容到即有的SQL语句中。
3、if元素应用示例:
choose元素<select id="findRole" paramterType="com.zzq.model.Role" resultType="map"> select id, role_name, note from tbl_role where 1=1 <if test="roleName!=null and roleName!=''"> and role_name=#{roleName} </if> </select>
1、应用场景:
if元素虽然可用于选择,但其只能做到单分支选择,因为其没有else分支,也就是说:多个if元素之间是没有关联关系的。这也就意味着要在多个if元素之间建立管理关系,需要通过该元素的test属性进行设置。其结果会导致if元素个数迅速增多。
为解决多条件间存在关联关系时,if元素个数增多的问题,映射器中提供了choose元素。其可用于多分支选择。其各分支由when子元素和otherwise子元素来提供。
2、choose元素的子
choose元素的子元素有两个,when和otherwise。其中when子元素拥有属性test来进行分支判断,其值也是交由内部的ONGL表达式引擎进行估值运算。而otherwise子元素则没有属性,因为其为choose元素的默认子分支。
3、choose元素应用示例:
<select id="findRole" paramterType="com.zzq.model.Role" resultType="map"> select id, role_name, note from tbl_role where 1=1 <choose> <when test="roleName!=null and roleName!=''"> and role_name=#{roleName} </when> <otherwise> and note is not null </otherwise> </choose> </select>
邮箱:zhaozhiqian001@163.com
参考资料:《深入浅出MyBatis技术原理与实践》--杨开振