mybatis常用动态SQL标签介绍+例子
mybatis常用动态SQL标签介绍+例子。本篇文章中,我们将深入介绍MyBatis中的动态SQL标签,并通过通俗易懂的说明和例子来帮助读者更好地理解其用法。
mybatis常用动态SQL标签介绍
当涉及到数据库操作和SQL查询时,MyBatis是一个非常强大且灵活的持久层框架。
其中,动态SQL标签是MyBatis中一个非常有用的特性,它允许我们根据不同的条件来动态生成SQL语句。
在本篇文章中,我们将深入介绍MyBatis中的动态SQL标签,并通过通俗易懂的说明和例子来帮助读者更好地理解其用法。
动态SQL
动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句.
我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。
使用 mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,以适应不同的查询需求。
1、if 语句
需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
<!--需求1:
根据作者名字和博客名字来查询博客!
如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
-->
selct blog from blog where author=#{author} and title=#{}
<if></if>
<select id="queryBlogIf" parameterType="map" resultType="blog">
select blog from blog where
<if test="author != null">
author=#{author}
</if>
<if test="title != null">
and title=#{title}
</if>
</select>
注意这样写我们可以看到,如果 author 等于 null,那么查询语句为 select * from user where and title=#{title},这是错误的 SQL 语句,
如何解决呢?请看下面的 where 语句!
2、where语句
修改上面的SQL语句,加入<where></where>
标签;
<select id="queryBlogIf" parameterType="map" resultType="blog">
select * from blog
<where>
<if test="title != null">
AND title = #{title}
</if>
<if test="author != null">
AND author = #{author}
</if>
</where>
</select>
这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。
此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
3、choose语句(choose、when、otherwise)
有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,
使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
<select id="queryBlogChoose" parameterType="map" resultType="blog">
select * from blog
<where>
<choose>
<when test="title!=null">
title=#{title}
</when>
<when test="author!=null">
and author=#{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>
4、foreach语句
用于动态生成循环操作,通常用于IN查询
或者批量插入操作
。
需求:将数据库中前三个数据的id修改为1,2,3;我们需要查询 blog 表中 id 分别为1,2,3的博客信息.
<!--
collection:指定输入对象中的集合属性
item:每次遍历生成的对象
open:开始遍历时的拼接字符串
close:结束时拼接的字符串
separator:遍历对象之间需要拼接的字符串
select * from blog where 1=1 and (id=1 or id=2 or id=3)
-->
<select id="queryBlogForeach" parameterType="map" resultType="blog">
select * from blog
<where>
<foreach collection="ids",item="item" open="and(" close=")" separator="or">
id=#{item}
</foreach>
</where>
</select>
5、set语句
如果在进行更新操作的时候,含有 set 关键词,我们怎么处理呢?
注意set是用的逗号隔开
<!--注意set是用的逗号隔开-->
<update id="updateBlog" parameterType="map">
update blog
<set>
<if test="authod != null">
author=#{author},
</if>
<if test="title != null">
title=#{title}
</if>
</set>
where id=#{id}
</update>
6、trim语句
用于对SQL语句进行修剪或者添加额外的内容。
通常情况下,我们可以利用标签来去除SQL语句中不必要的部分,比如额外的逗号或者AND关键字,或者在特定条件下添加额外的内容。<trim>
标签有以下几个属性:
- prefix:前缀,表示在整个内容前面需要添加的内容。
- prefixOverrides:用于指定需要去除的前缀内容,多个前缀以逗号分隔。
- suffix:后缀,表示在整个内容后面需要添加的内容。
- suffixOverrides:用于指定需要去除的后缀内容,多个后缀以逗号分隔。
下面是一个示例,假设我们需要动态生成一个包含多个条件的WHERE子句:
<select id="getUserList" parameterType="map" resultType="User">
SELECT * FROM user
<where>
<trim prefix="AND" prefixOverrides="AND">
<if test="username != null">
AND username = #{username}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="gender != null">
AND gender = #{gender}
</if>
</trim>
</where>
</select>
在上述示例中,标签被用来动态生成包含多个条件的WHERE子句,它会自动去除最前面多余的AND,并且在每个条件之间添加必要的AND,以确保生成的SQL语句是合法的。
7、sql标签、include标签
<sql>
和<include>
标签都用于在MyBatis中处理可重用的SQL代码片段,可以在不同的语句中进行引用。
但它们之间有一些区别<sql>
标签用于定义可重用的SQL代码片段,可以在同一个XML文件中进行定义和引用。这样可以避免多次写入相同的SQL代码,提高了SQL语句的可维护性。
下面是一个使用标签定义和引用SQL代码片段的示例:
<sql id="userColumns">
id, username, password, email
</sql>
<select id="selectUsers" resultType="map">
SELECT
<include refid="userColumns"/>
FROM users
</select>
在上面的示例中,我们使用标签定义了一个名为"userColumns"的SQL代码片段,然后在语句中使用标签引用了这个代码片段,从而避免了重复书写列名。
<include>
标签则用于引用外部的SQL片段文件,可以在不同的XML文件中定义和引用。这样可以实现不同SQL片段的复用,提高了SQL语句的可重用性。下面是一个使用标签引用外部SQL片段文件的示例:
定义一个userColumns.xml文件:
<sql id="userColumns">
id, username, password, email
</sql>
在主XML文件中引用userColumns.xml文件:
<select id="selectUsers" resultType="map">
SELECT
<include file="userColumns.xml"/>
FROM users
</select>
在这个示例中,我们将标签定义的SQL代码片段存放在一个独立的userColumns.xml文件中,然后在主XML文件中使用标签引用了这个外部的SQL片段文件。
总的来说,<sql>
标签适用于在同一个XML文件中定义和引用SQL代码片段,<include>
标签适用于引用外部的SQL片段文件,实现了更大范围的SQL代码的复用。

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