后端——框架——持久层框架——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,执行

原文地址:https://www.cnblogs.com/rain144576/p/12228970.html