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 |
|
动态解析为:
|
1 |
|
一个 #{ } 被解析为一个参数占位符 ? 。
而${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
例如,Mapper.xml中如下的 sql:
|
1 |
|
当我们传递的参数为 "Jack" 时,上述 sql 的解析为:
|
1 |
|
预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。
综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

浙公网安备 33010602011771号