普通标签

1.1 select

        查询标签主要理解两个映射,第一个映射发生在执行SQL语句之前,根据Mapper接口中的方法找到Mapper文件中对应的SQL语句。第二个映射发生在执行SQL语句之后,根据查询得到的结果集,将结果集映射为Java对象。接下来也分为两个阶段介绍它的每个属性

        执行SQL之前:

  1. id:该属性在同一个命名空间中必须唯一,它建立Mapper配置文件中标签与Mapper中方法的映射关系。
  2. parameterType:用于指定接口方法中参数的类型。如果是基本数据类型或与之对应的Java类,则不用设置。如果是其他类型,例如Map,必须设置参数类的全名。
  3. statementType:执行SQL语句需要创建的statement对象,每个值对应JDBC中的一种statement。
  4. timeout:设置执行SQL语句的超时时间,单位为毫秒。
  5. databaseId:设置数据库厂商的标识,在某些情况下用处很大,例如分页时Oracle和mysql的写法完全不同。一般情况下会自动判断,但是也可以手动配置,此时databaseId的值必须与config配置文件中的databaseIdProvider对应。
  6. useCache:是否启用二级缓存。一般不在单个select配置,直接配置cache标签。
  7. flushCache:是否停用一级缓存,当该值为true时,每次执行select语句都会清空一级缓存。一级缓存是sqlSession的缓存,它默认是开启的。

        执行SQL之后:

  1. resultType:建立结果集与Java类的映射关系,此时使用的是默认的驼峰方式,例如user_name会转换为userName属性。
  2. resultMap:建立结果集与Java类的映射关系,它的值为resultMap标签的id,这个标签在第六章节介绍一对一,一对多,多对多时在详细介绍。
  3. resultsetType:指定结果集的类型,它与JDBC中resultSet对象的类型一一对应。

        杂项:

  1. fetchSize:指定返回条数,这个没什么用,一般使用分页插件实现。
  2. resultSets:多个结果集的名称,基本只有在调用存储过程时,存在多个出参时才会发生,基本没用过。
  3. resultOrdered:这个标签没有用到过,也没有理解具体的意思。

1.2 insert

        Insert标签中大部分的属性与select标签相同,含义也相同,这里介绍insert标签独有的属性。

  1. useGeneratedKeys:默认为false。如果为true,Mybatis会调用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键。
  2. keyProperty:表中主键对应的属性名称。一般都是id。

        插入之后获取主键:

        使用selectKey标签,mysql数据库的语句为select last_insert_id()。不同的数据库使用不同的SQL语句。

1.3 update

        与select标签的属性基本相同。参考select

1.4 delete

        与select标签的属性基本相同。参考select。

动态标签

        SQL的动态标签有以下四类

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

2.1 分支

2.1.1 if

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

        属性:

        test: 指定分支的条件

        格式:

<if test="">sql</if>

        示例: 

<if test="userName != null">
  and user_name like concat("%",#{userName} ,"%")
<if>

2.1.2 choose & when & otherwise

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

        choose标签无任何意义。

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

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

        属性:

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

        格式:

<choose>
   <!—1到多个when标签 -->
   <when test=""></when>
   <!—只能存在一个-->
   <otherwise></otherwise>
</choose>

2.2 循环

2.2.1 forEach

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

        属性:

  1. collect:指定集合的类型,值一般为list或map
  2. open: 在循环之前,添加一个前缀。
  3. close: 在循环结束之后,添加一个后缀
  4. separator: 每次循环结束之后,添加一个分隔符,例如insert中的逗号
  5. Item:当collection表示list时,相当于定义一个临时变量,在标签内部使用此变量,当collection表示map时,临时变量的值为map每次循环的value值。
  6. 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>

2.3 格式

2.3.1 trim

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

        属性:

  1. prefix: 指定语句片段的前缀,例如拼接where条件时,WHERE作为前缀
  2. prefixOverrides: 去除多余的前缀,一般值都是 and | or,容易在拼接SQL语句时产生多余的and和or
  3. suffix: 指定语句片段的后缀。
  4. 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>

2.3.2  where

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

        格式:<where> </where>

2.3.3 set

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

        属性:

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

        格式:

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

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

2.4 其他

2.4.1 bind

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

        属性:

        name:变量的名称

        value:变量的值

        格式:

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

2.4.2 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的组合是唯一的。

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

        示例:

<!-- 数据库为mysql,执行 -->
<select id="selectById" databaseId="mysql"></select> 
<!-- 数据库为oracle,执行 -->
<select id="selectById" databaseId="oracle"></select> 
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐