Mybatis 动态SQL
1.MyBatis动态 sql 是什么
MyBatis 动态 SQL 是一种用于在 SQL 映射文件中根据不同条件动态生成 SQL 查询语句的技术。动态 SQL 允许你根据不同情况生成不同的 SQL 片段,从而构建更加灵活和可复用的数据库查询操作。这是 MyBatis 强大的特性之一,可以帮助开发者处理各种复杂的查询需求。
1.0Mybatis的9种动态sql标签有哪些?
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支判断 |
choose(when、otherwise) | 相当于 Java 中的 switch case 语句 | 多条件分支判断 |
trim,where | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
bind | 辅助元素 | 拼接参数 |
1.1 if标签(类似于java的if语句)
在 MyBatis 中,<if>
标签是一种用于条件判断的XML元素,它允许你在 SQL 映射文件中根据条件动态地生成 SQL 语句的一部分。
例如:
<select id="getUsers" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
在这个例子中,如果传入的参数中有 name
和 age
字段,那么生成的 SQL 语句会根据这些条件进行过滤。
1.2 chooese(when,otherwise)(类似于java的switch语句)
<choose>
标签的基本语法如下:
<select id="selectUserByChoose" resultType="com.ys.po.User" parameterType="com.ys.po.User">
select * from user
<where>
<choose>
<when test="id !='' and id != null">
id=#{id}
</when>
<when test="username !='' and username != null">
and username=#{username}
</when>
<otherwise>
and sex=#{sex}
</otherwise>
</choose>
</where>
</select>
也就是说,这里我们有三个条件,id、username、sex,只能选择一个作为查询条件
-
如果 id 不为空,那么查询语句为:
select * from user where id=?
-
如果 id 为空,那么看username 是否为空,如果不为空,那么语句为
select * from user where username=?;
-
如果 username 为空,那么查询语句为
select * from user where sex=?
1.3 foreach
foreach是用来对集合的遍历,这个和Java中的功能很类似。通常处理SQL中的in语句。
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
//批量查询
<select id="findAll" resultType="Student" parameterType="Integer">
<include refid="selectvp"/> WHERE sid in
<foreach item="ids" collection="array" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
//批量删除
<delete id="del" parameterType="Integer">
delete from student where sid in
<foreach item="ids" collection="array" open="(" separator="," close=")">
#{ids}
</foreach>
</delete>
1.4 trim
它常用于处理动态 SQL 中可能出现的不必要的逗号、AND、OR 等连接词,以及添加包裹的括号等情况,从而生成更加合法和可读的 SQL 语句。
<select id="selectUserByUsernameAndSex" resultType="user" parameterType="com.ys.po.User">
select * from user
<!-- <where>
<if test="username != null">
username=#{username}
</if>
<if test="username != null">
and sex=#{sex}
</if>
</where> -->
<trim prefix="where" prefixOverrides="and | or">
<if test="username != null">
and username=#{username}
</if>
<if test="sex != null">
and sex=#{sex}
</if>
</trim>
</select>
-
prefix:前缀
-
prefixoverride:去掉第一个and或者是or
常见的使用情况是在动态 SQL 中构建 WHERE 子句时,根据不同的条件判断动态添加不同的查询条件。同时,<trim>
标签还可以用于构建类似于 IN 语句等情况。
1.5 where+if标签
是用于构建 SQL 查询条件的 XML 元素。它通常用于在动态 SQL 中创建 WHERE 子句,可以在 WHERE 子句的开头自动添加适当的连接词(如 AND 或 OR),以避免不必要的连接词出现在查询语句中。
<select id="findQuery" resultType="Student">
<include refid="selectvp"/>
<where>
<if test="sacc != null">
sacc like concat('%' #{sacc} '%')
</if>
<if test="sname != null">
AND sname like concat('%' #{sname} '%')
</if>
<if test="sex != null">
AND sex=#{sex}
</if>
<if test="phone != null">
AND phone=#{phone}
</if>
</where>
</select>
常见的使用情况是在 SQL 查询语句中根据多个条件动态地构建 WHERE 子句。这有助于避免在没有条件的情况下生成不必要的 AND 连接词,提高 SQL 查询语句的可读性。