Mybatis的xml映射文件的常用标签含义解析

一、顶级标签

sql – -----------------可被其他语句引用的可重用语句块。 ;相当于 定义一个通用的sql,在xml文件的其他sql里进行引用;
<sql id="valid"> where valid = 1 </sql>
<select id = 'queryUser'>select * from user <include refid = 'valid'></include>

效果相当于:<select id = 'queryUser'>select * from user where valid = 1 </include>

insert 、update、delete  这个比较好理解

二、动态sql标签

  • if

<if test="name 1= null"> AND AND name like #{name}  </if> 

意思是 当test = ‘true' 时sql 会拼接加上if标签中的and 条件;当 if test =‘false’ 时 不增加 if 标签中的and 条件;

  • choose (when, otherwise):

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,防止关键字多于错误。

  • trim (where, set)

主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix。
可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides。正因为 <trim> 元素有这样的功能,所以也可以非常简单地利用 <trim> 来代替 <where> 元素的功能。

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

//set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

trim属性

prefix:当trim元素内包含内容时,会给内容增加prefix指定前缀
prefixOverrides: 当trim元素内包含内容时,会把内容中匹配的前缀字符串去掉
suffix: 当trim元素内包含内容时,会给内容增加suffix指定的后缀
suffixOverrides:当trim内包含内容时,会把内容中匹配的后缀字符串去掉

 

  • foreach

//collection="要遍历的集合" 
//item = "可以在元素体内使用的集合项"
//index = "索引"
//open = "开始字符串"
//separator = "分隔符"
//close = "结束字符串"
<select id="selectUser" resultType="User">
  SELECT *
  FROM User
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>
bind

  • bind

可以创建一个变量并将其绑定到上下文
<select id="selectUser" resultType="user">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM User
  WHERE name LIKE #{pattern}
</select>

$ 与 # 区别 :

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。

#{ }:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。

例如,Mapper.xml中如下的 sql 语句:

1

select from user  where  name  = #{name};

动态解析为:

1

select from user  where  name  = ?;

一个 #{ } 被解析为一个参数占位符 ? 。

而${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

例如,Mapper.xml中如下的 sql:

1

select from user  where  name  = ${name};

当我们传递的参数为 "Jack" 时,上述 sql 的解析为:

1

select from user  where  name  = "Jack";

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。

综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

 

posted @ 2020-05-12 14:36  songtt2015  阅读(196)  评论(0)    收藏  举报