动态SQL

76 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

什么是动态sql

通过mybatis提供的各种标签方法实现动态拼接sql的过程

If标签

根据用户名和用户类别查询用户时,我们编写的sql语句如下

<select id="queryByNameAndProfession" resultType="demo2.domain.Customer" parameterType="String">
    SELECT * FROM customer WHERE cust_name = #{custName} and cust_profession =#{custProfession}
</select>

有可能传入的用户名或用户类别为空,那么可能导致我们编写的sql语句出问题

那么我们就可以使用mybatis提供的if标签来解决这个问题

我们可以使用if标签来进行非空判断,动态地拼接sql语句

<select id="queryByNameAndProfession" resultType="demo2.domain.Customer" parameterType="String">
    SELECT * FROM customer WHERE
    <if test="custName!=null and custName!=''">
        cust_name = #{custName}
    </if>
    <if test="custProfession !=null and custProfession !=''">
        and cust_profession =#{custProfession}
    </if>
</select>

我们仔细看这个sql语句就会发现,如果第一个条件不成立(即custName为空),那么我们拼接出来的sql语句就是 SELECT **** *FROM customer WHERE  and cust_profession =#{custProfession} ,这将导致我们sql执行时报错,因此mybatis给出了where标签代替where关键字的解决方案

Where标签

和if标签搭配使用时,会去掉紧跟where关键字后面的and关键字

<select id="queryByNameAndProfession" resultType="demo2.domain.Customer" parameterType="String">
    SELECT * FROM customer
    <where>
        <if test="custName!=null and custName!=''">
            cust_name = #{custName}
        </if>
        <if test="custProfession !=null and custProfession !=''">
            and cust_profession =#{custProfession}
        </if>
    </where>
</select>

如果第一个条件不成立,拼接第二个条件时会把第二个条件的and关键字去掉,则拼接出来的sql语句是SELECT **** *FROM customer WHERE  cust_profession =#{custProfession}

Foreach标签

当我们的查询条件的值为我们指定的值当中,即使用in关键字,那么使用foreach标签。

<select id="queryInId" resultType="demo2.domain.Customer" >
    SELECT * FROM customer WHERE cust_id in(2,3,4)
</select>

在foreach标签中,我们可以以数组、List、VO对象的形式给出指定的值。

数组形式示例

图片1.png

图片2.png

List形式

图片3.png

图片4.png

VO对象形式

图片5.png

图片6.png

图片7.png

图片8.png

Sql片段

Sql中可将重复的sql语句提取出来,使用时用include标签根据sql片段的id引用即可,最终达到sql重用的目的。

图片9.png

抽取sql片段后

图片10.png