[MyBatis]--(4)动态SQL语句--(1)选择

版权声明: https://blog.csdn.net/zhaoyaxuan001/article/details/80788126

声明:

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元素应用示例:

<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>


choose元素

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>


邮箱:[email protected]

参考资料:《深入浅出MyBatis技术原理与实践》--杨开振


猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/80788126
今日推荐