zoukankan      html  css  js  c++  java
  • 后端——框架——持久层框架——Mybatis——《Mybatis从入门到精通》读书笔记——第四章节(动态标签)

      本章介绍SQL的动态标签,常用的有三种类型,其他的都归在杂项

    1. 分支:if,[choose,when,otherwise。
    2. 循环:foreach。
    3. 格式:trim,where,set。
    4. 杂项:databaseId,bind。

    1、分支

    1.1 If

    表格1- 1 if标签

    名称

    If

    描述

    与编程语言中的单If语句相同。通常用于where条件,insert,update语句中列的判断。

    属性

    Test:指定分支的条件

    格式

    <if test=””>sql</if>

    示例

    根据姓名模糊查询用户:

    <if test=”userName != null”>

        and user_name like concat("%",#{userName} ,"%")

    <if>

    1.2 choose,when,otherwise

    表格1- 2 choose,when,otherwise

    名称

    Choose,when,otherwise

    描述

    与编程语言中的if,elseif,else格式相同。含义稍微有些区别,

    l  choose标签无任何意义。

    l  When标签对应if,每个test对应分支的条件,多个when之间并不存在if,elseif之间的关系。彼此都是独立的,相当于写了多个if。

    l  Otherwise标签与else格式含义相同,当上述中所有when的分支都不满足时,执行otherwise,并不对应具体的when分支。

    属性

    只有when标签存在test属性,与if标签的test属性含义相同,值为分支的条件。

    格式

    <choose>

       <!—1到多个when标签 -->

       <when test=””></when>

       <!—只能存在一个-->

       <otherwise></otherwise>

    </choose>

    2、循环

    表格2- 1 foreach

    名称

    foreach

    描述

    用于循环拼接SQL语句,常用于拼接in条件,批量插入的语句。在整个循环过程中,都是一条SQL语句。

    属性

    collection:指定集合的类型,值一般为list或map

    Open:在循环之前,添加一个前缀。

    close:在循环结束之后,添加一个后缀

    separator:每次循环结束之后,添加一个分隔符,例如insert中的逗号

    Item:当collection表示list时,相当于定义一个临时变量,在标签内部使用此变量,当collection表示map时,临时变量的值为map每次循环的value值。

    Index:当collection表示list时,值为数字,表示当前循环的索引值。当collection表示map时,值为字符串,表示当前map的key值。

    格式

    <foreach collection= "list" open= "(" close= ")" separator="," item=" " index=””>

       Sql片段

    </foreach>

    示例

    批量插入多个用户,为了简便只写了两个属性id,name,可以根据自身需求添加任何其他属性

    <foreach collection= "list" open= "(" close= ")" separator="," item="user">

             (#{user.id},#{user.name})

    </foreach>

    3、格式

    3.1 Trim

                                                           表格3- 1 trim标签

    名称

    trim

    描述

    用于去掉SQL语句中多余的前缀和后缀,注意整个过程中,都是一条SQL语句。

    属性

    prefix:指定语句片段的前缀,例如拼接where条件时,WHERE作为前缀

    prefixOverrides:去除多余的前缀,一般值都是 and | or,容易在拼接SQL语句时产生多余的and和or

    suffix:指定语句片段的后缀。

    suffixOverrides:去除多余的后缀,一般都是逗号,在批量插入时,去除最后一个逗号。

    格式

    <trim prefix= "where" prefixOverrides=”” suffix=”” suffixOverrides=””>

       Sql片段

    </trim>

    示例

    等价<where>

    <trim prefix= "where" prefixOverrides=”and | or”>

       Sql片段

    </trim>

    等价<set>

    <trim prefix= "set" suffixOverriders=”,”>

       Sql片段

    </trim>

    3.2 where

    表格3- 2 where标签

    名称

    Where标签

    描述

    Where标签对应SQL片段中的where条件,包含在where标签内部的SQL片段会自动去除多余的and,or前缀

    属性

    格式

    <where></where>

    3.3 Set

                                                          表格3- 3 set标签

    名称

    set标签

    描述

    Set标签对应更新SQL中的set片段。包含在set标签内部的SQL片段会自动去除多余的逗号。

    属性

    格式

    <set>

       <if test=”fieldName!=null”>columnName = #{fieldName},</if>

    </set>

    其中fieldName为Java类中属性的名称,columnName对应表的列名。最后的逗号不可省略。

    4、杂项

    4.1 bind标签

    表格4- 1 bind标签

    名称

    bind

    描述

    bind标签用于定义一个临时变量,在之后的SQL语句中可以引用此变量,类似其他配置文件中的property,只不过它不可以引入properties文件。

    属性

    name:变量的名称

    Value:变量的值

    格式

    <bind name=”” value=””></bind>,它的作用域不是整个Mapper文件,而是某个SQL语句的标签内部。例如where标签内。

    4.2 databaseId属性

    表格4- 2 databsaeId属性

    名称

    databaseId

    描述

    它对应于config配置文件中的databaseIdProvider,用于区分数据库的类型。

    在Mapper配置文件中,它与id作为联合主键,与接口中的方法一一对应,例如存在select标签,它的id为selectById,默认情况下它与接口中的selectById方法对应,当指定databaseId时,当数据库类型为Mysql时,会执行databaseId为mysql,id为selectById的SQL,当为oracle时,会执行databaseid为oracle,id为selectById的SQL。默认id是唯一的,添加databaseId后,databaseId与id的组合是唯一的。

    它不是一个标签,而是一个标签的属性。

    格式

    <select id=”selectById” databaseId=”mysql”></select> 数据库为mysql,执行

    <select id=”selectById” databaseId=”oracle”></select> 数据库为oracle,执行

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/rain144576/p/12228970.html
Copyright © 2011-2022 走看看