MyBatis使用动态SQL标签的小陷阱

作者:心路无途 时间:2023-09-11 04:42:57 

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点。

MyBatis中提供动态SQL功能,我们可以使用<if><when><where><otherwise><foreach>等等,这样我们就可以写出根据条件生成的动态SQL了,但是,在这中间,我们经常用到的<if>标签有一个小误区,一不小心就会掉下去,下面先举个正常的例子:


<select id="findActiveBlogWithTitleLike"
parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE'
<if test="title != null">
AND title like #{title}
</if>
</select>

在上面的例子中,当title不等于null时,<if>标签中间的条件才会被拼接上,这样,SQL语句就是动态的了。

但是,当我们对所有条件进行判断时,你是否会这样写:


<select id="findActiveBlogWithTitleLike"
parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="userId != null">
state = ‘ACTIVE'
</if>
<if test="title != null">
AND title like #{title}
</if>
</select>

没问题吧?至少语法上不错的,至少它可以正常生成一个SQL。

但是,不知道你注意到了没,当所有条件都为null的时候,会出现什么情况?


SELECT * FROM BLOG
WHERE

看到了吧?这样的SQL能成功执行么?

答案当然是NO。

那么该怎么办?那就要记住了,当你写动态SQL时候,先考虑一下会不会产生所有条件都不成立的情况,会不会出现只有一个WHERE而没有条件的情况,那么你要做的就是加一个<where>标签将所有条件包起来。


<select id="findActiveBlogWithTitleLike"
parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="userId != null">
state = ‘ACTIVE'
</if>
<if test="title != null">
AND title like #{title}
</if>
</where>
</select>

这样,当所有条件都不成立时,WHERE也不会被拼上。

这时,有机灵的小伙伴发现了,如果第一个条件不成立,第二个成立,那SQL会不会变成这样?


SELECT * FROM BLOG
WHERE
AND title like #{title}

这个就放心好了,当你用<if>标签包围条件后,它会自动去掉AND的。

以上所述是小编给大家介绍的MyBatis使用动态SQL标签的小陷阱网站的支持!

来源:http://www.cnblogs.com/xinluwutu/archive/2016/10/13/5952285.html

标签:mybatis,动态,sql
0
投稿

猜你喜欢

  • 一文理解kafka rebalance负载均衡

    2022-12-02 10:35:22
  • 详解java中static关键词的作用

    2023-12-02 00:32:00
  • Android简单实现文件下载

    2023-08-28 06:33:17
  • 在mybatis 中使用if else 进行判断的操作

    2021-11-10 23:17:11
  • 用Spring Native将SpringBoot程序转换为GraalVM

    2023-09-17 16:23:00
  • C# 通过同步和异步实现优化做早餐的时间

    2022-10-27 23:09:27
  • SpringBoot中使用JeecgBoot的Autopoi导出Excel的方法步骤

    2023-03-31 03:38:11
  • Android三种网络通讯方式及Android的网络通讯机制

    2021-08-20 12:54:31
  • Java Exception 捕获和显示实例详解

    2022-07-05 22:41:09
  • 利用Java生成带有文字的二维码

    2022-05-21 15:01:38
  • Java 用Prometheus搭建实时监控系统过程详解

    2023-09-06 12:07:40
  • Java的动态分派和静态分派的实现

    2023-10-09 12:58:37
  • Android的UI调优教程

    2021-12-16 01:46:43
  • C# 判断字符串第一位是否为数字

    2023-05-29 20:06:44
  • 详解Java环境变量配置方法(Windows)

    2022-05-09 02:39:33
  • C#多线程之任务的用法详解

    2023-08-27 10:51:18
  • C#中使用Join与GroupJoin将两个集合进行关联与分组

    2023-11-11 23:40:47
  • 浅谈Java解释器模式

    2021-08-23 23:45:59
  • 基于JavaSwing设计和实现的酒店管理系统

    2022-03-31 12:12:14
  • Unity shader实现消融效果

    2023-03-06 01:06:44
  • asp之家 软件编程 m.aspxhome.com