本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。欢迎转载,转载请注明出处(https://blog.csdn.net/feng_xiaoshi/article/details/105903135),谢谢。
简介
“How painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.”
操作 SQL
select
参数名称格式
定义参数名称的方法有以下三种:
- #{id} mybatis风格
- :id JPA风格
- ? JDBC风格
注意
:它们不能混用,只能是一种类型的语句。
<select id="users-hash">
select id, name from User where id = #{id} or name like #{name}
</select>
<select id="users-dot">
select id, name from User where id = :id or name like :name
</select>
<select id="users-question">
select id, name from User where id = ? or name like ?
</select>
insert
一个 insert 标签可以与几个 if 标签配合使用,用来区分不同的条件。
<insert id="insertUser" type="NATIVE">
insert into User
<if
test="username != null and password != null and email != null and bio != null">
(username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio})
</if>
<if
test="username != null and password != null and email != null and bio == null">
(username,password,email) values (#{id},#{username},#{password},#{email})
</if>
<if
test="username != null and password != null and email == null and bio == null">
(username,password) values (#{id},#{username})
</if>
</insert>
delete
delete 标签和 insert 标签一样,可以通过配合 if 标签来使用,但是一般是通过 where 语句固定查询。
<delete id="deleteAuthor" type="NATIVE">
delete from Author where id = #{id}
</delete>
update
update 标签可以与几个 if 标签使用,当要更新多列时,必须使用 set 标签。
<update id="updateUser" type="NATIVE">
update User
<set>
<if test="username != null">username = #{username}</if>
<if test="password != null">password = #{password}</if>
<if test="email != null">email = #{email}</if>
</set>
where id = #{id}
</update>
动态 SQL
mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体 mybatis 动态 SQL 语句主要有以下几类:
序号 | 标签 | 作用 |
---|---|---|
1 | if | 简单的条件判断 |
2 | choose,when,otherwise | 相当于 java 语言中的 switch ,与 jstl 中的choose 类似. |
3 | trim | 对包含的內容加上 prefix(前缀),或者 suffix(后缀) |
4 | where | 主要是用來简化 sql 语句中 where 条件判断的,能智能的处理 and or ,不必担心多余致语法错误 |
5 | set | 主要用于更新时 |
6 | foreach | 在实现 mybatis in 语句查询时特别有用 |
if
if 标记是最常使用的标记,它可能在查询,删除,更新时使用,必须与 test 属性结合使用,用来判断 if 标签中的验证条件是 true 或 false,是基于 OGNL 的表达式,当条件为 true 时,SQL 语句将附加到主查询。例如下面语句中:
<select id="selectUser" type="JPQL">
select id, name from User
<if test="name != null">
where name like #{name}
</if>
</select>
如果 name 是 null ,则执行下面 sql 语句:
select id, name from User where name like #{name}
choose, when, otherwise
当需要在许多选项中仅选择一种情况时,必须使用 choose 标签。一般配合 when,otherwise 标签使用:
<select id="selectUser" type="JPQL">
select id, name from User
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="password != null">
AND password = #{password}
</if>
<choose>
<when test="email != null">
AND email = #{email}
</when>
<when test="username != null">
AND username like #{username}
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
- 标签允许定义适用于多个选项之一的条件。
- 满足 标签中指定的条件时,SQL附加到主查询。
- 如果不满足所有其他条件,将 标签 SQL附加到主查询。
choose when otherwise 标签帮助开发者实现了类似 if else,switch case default 的实现。
trim
trim 标签一般用于去除 sql 语句中多余的 and 关键字,逗号,或者给 sql 语句前拼接 “where“、“set“ 以及 “values(“ 等前缀,或者添加 “)“ 等后缀,可用于选择性插入、更新、删除或者条件查询等操作,格式化输出。
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
上面的 trim 表示的是要在所包含的 SQL 语句前面添加 WHERE 关键字,同时去除 sql 语句前面的 AND 或 OR 关键字。
trim 标签的4大属性:
- prefix: 当 trim 元素包含有内容时, 增加 prefix 所指定的前缀
- prefixOverrides: 当 trim 元素包含有内容时, 去除 prefixOverrides 指定的 前缀
- suffix: 当 trim 元素包含有内容时, 增加 suffix 所指定的后缀
- suffixOverrides: 当 trim 元素包含有内容时, 去除 suffixOverrides 指定的后缀
where
where 主要是用来简化 sql 语句中 where 条件判断,自动地处理 AND或OR 条件,可以动态的将第一个符合条件( if 标签中的验证条件是 true )的 sql 语句附加到主查询。
<select id="selectUser" type="JPQL">
select id, name from User
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="password != null">
and password = #{password}
</if>
<if test="email != null">
or email = #{email}
</if>
</where>
</select>
如果 state 不是 null , 那么将 and state = #{state}
添加到主查询上。
select id, name from Groups and state = #{state}
set
set 标签可动态包含要更新的列,而忽略其他列,使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。
<update id="updateUser" type="NATIVE">
update User
<set>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
<if test="email != null">email = #{email}</if>
</set>
where id = #{id}
</update>
在第一个符合条件( if 标签中的验证条件是 true )语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段。
foreach
<select id="selectUser" resultType="sample.mybatis.User">
select *
from User
where id in
<foreach collection="list" item="item"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
标签允许在遍历集合时编写SQL
collection 指定要遍历属性的集合
list 是一个引用名称,可将迭代对象传递给参数,则默认情况下可以使用该引用名称
item 声明一个临时变量名称,该名称引用属性中迭代的每个元素。
open 该属性指定要添加到迭代开始的字符串。
separator 该属性指定在每个迭代结果之间插入的字符串。
close 该属性指定要添加到迭代末尾的字符串。
index 还有一个属性,因此您可以声明一个临时变量名称以引用重复的索引值。主要用于IN子句的动态生成
总结
在本文中,简单介绍了 MyBatis 的标签,MyBatis 提供的不同功能如:查询、更新、删除、新增。以及动态 SQL 的标签开发。
参考资料
MyBatis Dynamic SQL(MyBatis 动态SQL)
Dynamic SQL