动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

Mybatis的动态SQL

06-19 16:43 706浏览
举报 T字号
  • 大字
  • 中字
  • 小字

动态SQL是MyBatis 的强大特性之一。顾名思义,就是会动的SQL,即是能够灵活的根据某种条件拼接出完整的SQL语句。这种类似于MySQL中的case when then else then end....这种语法,能够根据某种条件动态的拼接出需要的SQL。

至于Mybatis如何实现动态SQL呢,Mybatis提供了非常多的标签,能够让我们在XML文件中灵活的运用这些标签达到拼接SQL的目的。

if(判断元素)

我们在代码中时常使用if语句来做判断,而在Mybatis里,也可以使用if元素,下面我们通过实例来看一个简单的用法:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    WHERE 1=1
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
</select>

这里我们使用一个if语句来探测prodName是否为空,如果不为空就加上prod_name的模糊匹配,如果参数为空就不构造这个条件。 在这里我们看到有个WHERE 1=1其实这里是为了防止后面条件一旦为真,那么不加上WHERE 1=1的话,查询语句就变成了SELECT * FROM products AND prod_name like '%${prodName}%' ,直接接上了AND,有问题了。

其实还有几种方法可以让我们不使用WHERE 1=1

where, trim, set

针对上面的 WHERE 1=1我们可以使用WHERE元素替代:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    <where>
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </where>
</select>

where元素里面的if为真时,它才会把WHERE子句加进去,而且会自动调整AND是否存在。

也可以使用trim来调整格式:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    <trim prefix="WHERE" prefixOverrides="AND">
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </trim>
</select>

在这里prefix代表前缀,prefixoverride则会去掉第一个AND,所以最后的效果和where元素是一样的。

而set元素则是应用于更新,加入我们要更新某个字段:

<update id="updateProduct" parameterType="com.shuqing28.pojo.Products">
    UPDATE products
    <set>
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </set>
    WHERE prod_id=#{prodId}
</update>

这里用set包裹,也就是如果if元素判断为真,就会自动添加SET子句

UPDATE products SET prod_name like '%${prodName}% WHERE prod_id=#{prodId}

当然也可以使用trim元素:

<trim prefix="SET" suffixOverride=",">...</trim>

只要把前缀换成SET,suffixOverride则会自动把最后的不需要的,去掉,当然set自带去最后逗号的功能。

foreach

显然foreach是一个循环语句,它的作用就是遍历集合,如果传入的是一个List、Set接口的集合,那么它就可以大展身手了。 假如有以下的查询:

SELECT * FROM products WHERE prod_id IN ("ANV01", "ANV02", "ANV03");

那么我们可以把3个参数封装到一个List中,然后用foreach语句遍历取出:

<select id="findProductListByProdId" parameterType="java.util.List"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    WHERE prod_id IN
    <foreach item="prod_id" index="index" collection="list" open="(" separator="," close=")">
            #{prod_id}
    </foreach>
</select>

想深入学习Mybatis的动态SQL的相关应用,可以到动力节点在线观看相关的Mybatis视频教程,开启全新的学习模式。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵652
程序员代码小兵652

113篇文章贡献392215字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消