动态 SQL 简介
动态 SQL 是 MyBatis 的强大特性之一,它允许在 XML 映射文件内以标签的形式编写动态 SQL,完成逻辑判断和动态拼接 SQL 的功能。动态 SQL 可以根据用户输入或外部条件动态地构建查询,避免了硬编码查询逻辑,简化了数据库查询的复杂度,同时提高了代码的可读性和维护性。
MyBatis 动态 SQL 标签
MyBatis 提供了多种动态 SQL 标签,以下是一些常用的标签:
<if>
:根据条件动态拼接 SQL。<choose>
、<when>
、<otherwise>
:类似于 Java 中的 switch-case 语句。<trim>
、<where>
、<set>
:用于处理 SQL 语句的不同部分,如自动添加 WHERE,并去除多余的 AND。<foreach>
:用于处理集合,生成 IN 查询。
动态 SQL 的执行原理
MyBatis 动态 SQL 的执行原理是使用 OGNL 从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL,以此来完成动态 SQL 的功能。
动态 SQL 实例
条件查询操作
以下是一个使用 <if>
标签的示例,根据输入条件动态构建查询:
xml
<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>
在这个例子中,如果传入的参数对象中包含 sacc
属性,则会添加一个 sacc
的查询条件;同理,如果包含 sname
、sex
或 phone
属性,也会相应地添加查询条件。
选择查询操作
<choose>
、<when>
、<otherwise>
标签组合用于条件分支选择:
xml
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
在这个例子中,如果传入了 title
则按 title
查找,传入了 author
则按 author
查找,若两者都没有传入,则返回标记为 featured 的 BLOG。
更新操作
<set>
标签用于构建动态 SQL 语句中的 UPDATE
操作:
xml
<update id="upd">
update student
<set>
<if test="sname != null">sname=#{sname},</if>
<if test="spwd != null">spwd=#{spwd},</if>
<if test="sex != null">sex=#{sex},</if>
<if test="phone != null">phone=#{phone}</if>
</set>
sid=#{sid}
where sid=#{sid}
</update>
在这个例子中,只有非空的字段才会被更新。
结语
MyBatis 动态 SQL 提供了一种灵活且强大的方式来构建 SQL 语句,使得开发者可以根据不同的条件动态地生成 SQL。这不仅提高了代码的可维护性,也使得 SQL 语句更加清晰和易于理解。希望这篇博客能帮助你更好地理解和使用 MyBatis 动态 SQL。
标签:sname,标签,查询,详解,SQL,MyBatis,动态 From: https://blog.csdn.net/weixin_73687229/article/details/143509784