📜  动态 SQL(1)

📅  最后修改于: 2023-12-03 15:07:18.205000             🧑  作者: Mango

动态 SQL

动态 SQL 是指在程序运行时动态生成 SQL 语句的技术,与静态 SQL 相对。静态 SQL 是指在程序编译时就已经确定了 SQL 语句,而动态 SQL 可以根据程序运行时的变化进行相应的动态生成,这种方式更加灵活。

为什么要使用动态 SQL?

动态 SQL 的使用场景有很多,最常见的就是当需要根据某些条件动态生成 SQL 语句时。举个例子,如果有一个搜索功能,用户可以输入不同的关键词来查询数据库中的数据,那么查询语句就需要根据用户输入的不同关键词来动态生成,这时就需要使用动态 SQL。

另外,动态 SQL 还可以用来构建动态的条件查询,批量插入、更新、删除等操作,使得操作数据库更加灵活。

怎么使用动态 SQL?

使用动态 SQL 一般需要借助一些工具或者框架,比如 MyBatis、Hibernate 等 ORM 框架。在这里我们以 MyBatis 为例来介绍动态 SQL 的使用。

MyBatis 中动态 SQL 最常用的标签有 <if><choose><when><otherwise>,这些标签都可以根据不同的条件进行动态生成 SQL 语句。

<if> 标签

<if> 标签可以根据条件生成 SQL 语句的一部分,例如:

<select id="findUserByName" resultType="User">
    select * from user
    <if test="name != null">
        where name = #{name}
    </if>
</select>

如果传入的参数中有 name 属性,则会生成类似于 select * from user where name = ? 的 SQL 语句,否则只会生成 select * from user 的 SQL 语句。

<choose><when><otherwise> 标签

<choose><when><otherwise> 标签可以根据多个条件生成不同的 SQL 语句,例如:

<select id="findUser" resultType="User">
    select * from user
    <choose>
        <when test="id != null">
            where id = #{id}
        </when>
        <when test="name != null">
            where name = #{name}
        </when>
        <otherwise>
            where 1=1
        </otherwise>
    </choose>
    order by create_time desc
</select>

如果同时传入了 idname 属性,则会生成类似于 select * from user where id = ? order by create_time desc 的 SQL 语句,如果只传入了 name 属性,则会生成类似于 select * from user where name = ? order by create_time desc 的 SQL 语句,如果没有传入任何属性,则会生成类似于 select * from user where 1=1 order by create_time desc 的 SQL 语句。

总结

动态 SQL 可以让我们根据程序运行时的变化来生成 SQL 语句,使得我们操作数据库更加灵活。在 MyBatis 等 ORM 框架中,我们可以使用 <if><choose><when><otherwise> 等标签来实现动态 SQL 的生成。