「Java知识」Mybatis的特性详解-动态SQL,拿走不谢

Mybatis的特性详解——动态SQL

  • 1.MyBatis if标签:条件判断
  • 2.MyBatis choose、when和otherwise标签
  • 5.MyBatis foreach标签
  • 仰天大笑出门去,我辈岂是蓬蒿人

动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。

动态 SQL 只有几个基本元素,与 JSTL 或 XML 文本处理器相似,十分简单明了,大量的判断都可以在 MyBatis 的映射 XML 文件里配置,以达到许多需要大量代码才能实现的功能。

好处: :动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

一、动态sql的元素

MyBatis 的动态 SQL 包括以下几种元素,如下表所示

1.MyBatis if标签:条件判断

MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句。使用 if 标签可以节省许多拼接 SQL 的工作,把精力集中在 XML 的维护上。 if 语句使用方法简单,常常与 test 属性联合使用。
语法如下:


    SQL语句

当判断条件为 true 时,才会执行所包含的 SQL 语句。

最常见的场景是在 if 语句中包含 where 子句,例如。

以上代表表示根据name去查找相应的信息,但是name是一个可填可不填的条件,不填写的时候不作为查询条件。

可多个 if 语句同时使用。以下语句表示为可以按照 name 或者 id 进行模糊查询。如果您不输入,则返回所有的记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录:

2.MyBatis choose、when和otherwise标签

MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到 ...... 的效果,可以借助 来实现。

动态语句 choose-when-otherwise 语法如下。


    
        SQL语句1
    
    
        SQL语句2
    
    
        SQL语句3
    
    
        SQL语句4
    

choose 标签按顺序判断其内部 when 标签中的判断条件是否成立,如果有一个成立,则执行相应的SQL 语句,choose 执行结束;

如果都不成立,则执行 otherwise 中的 SQL 语句。

这类似于 Java 的 switch 语句;

  • choose 为 switch,
  • when 为 case,
  • otherwise 则为 default。

示例

以下示例要求:

当网站名称不为空时,只用网站名称作为条件进行模糊查询;

当网站名称为空,而网址不为空时,则用网址作为条件进行模糊查询;

当网站名称和网址都为空时,则要求网站年龄不为空.


    

这样 MyBatis 就会根据参数的设置进行判断来动态组装 SQL,以满足不同业务的要求。远比 Hibernate 和 JDBC 中大量判断 Java 代码要清晰和明确。

3.MyBatis where标签

where 标签

where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下


    
        AND/OR ...
    

if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。

示例


    
    SELECT id,name,url,age,country
    FROM website
    WHERE name like #{pattern}

bind 元素属性如下:

  • value:对应传入实体类的某个字段,可以进行字符串拼接等特殊处理。
  • name:给对应参数取的别名。

以上代码中的“_parameter”代表传递进来的参数,它和通配符连接后,赋给了 pattern,然后就可以在 select 语句中使用这个变量进行模糊查询,不管是 MySQL 数据库还是 Oracle 数据库都可以使用这样的语句,提高了可移植性。

大部分情况下需要传递多个参数,下面为传递多个参数时 bind 的用法示例。

示例

//mapper文件中入参
public List selectUser(User user);
-- xml中

7.MyBatis trim标签

在 MyBatis 中除了使用 if+where 实现多条件查询,还有一个更为灵活的元素 trim 能够替代之前的做法。

trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。trim 语法格式如下。


    SQL语句

trim 中属性说明如下

示例

需要Java资料和面试题:转发+关注之后,私信【Java】即可!!!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章