带你了解MyBatis动态SQL_<include refid="generalworkorderquery" >

带你了解MyBatis动态SQL_<include refid="generalworkorderquery" >StringBuffer sbnew StringBuffer(“SELECT * from

StringBuffer sb=new StringBuffer(“SELECT * from bills INNER JOIN Provider ON Providers.providerId=bills.pid where 1=1”);

if(search_title!=null!search_title.equals(\”\”)){

sb.append(\’且标题为\’%“+search_title+”%””);

}

if(search_pid!=-1){ //必须选择查询条件!

sb.append(\” 和pid=\”+search_pid);

}

if(search_pay!=-1){ //查询条件一定要选好!

sb.append(\” and pay=\’+search_pay);

}

字符串sql=sb.toString();

System.out.println(\”SQL语句为:\”+sql);

使用动态SQL 通常不是一个单独的部分。 MyBatis 通过使用强大的动态SQL 语言,可以在任何SQL 映射语句中使用,确实改善了这种情况。

动态SQL 元素类似于使用JSTL 或其他类似的基于XML 的文本处理器。 MyBatis 的早期版本有很多需要理解的地方。它们在MyBatis 3 中得到了显着改进,可用的元素不到原来的一半。 MyBatis 使用强大的基于OGNL(Struts2 语法)的表达式来消除其他元素。

mybatis动态SQL语句是基于OGNL表达式的。很容易在SQL语句中实现特定的逻辑。一般来说,mybatis动态SQL语句主要包括以下几类:

* **if语句**(简单条件判断)

* **choose(when,otherwise)**相当于Java语言中的switch,和jstl中的choose很相似。

* **修剪**(为包含的内容添加前缀、后缀等)

* **where**(主要用于简化确定SQL语句中的where条件,允许and或or被智能处理,而不用担心多余的语法错误)

* **设置**(主要用于更新)

* **foreach** (在用语句查询实现mybatis时特别有用)

### 2.分支判断

#### 2.1 if 元素

根据用户名和性别查询数据。如果用户名为空,则仅根据性别进行查询,否则仅根据用户名进行查询。

首先,不要使用动态SQL 编写。

从用户中选择*,其中用户名=#{用户名}且性别=#{性别}

在上面的查询语句中,可以看到如果#{username}为空,则查询结果也为空。我该如何解决这个问题?使用if 来决定

选择id=\’selectUserByUsernameAndSex\’ resultType=\’用户\’

参数类型=“用户”

从用户位置选择*

用户名=#{用户名}

性别=#{性别}

这样写,我们知道如果gender等于null,查询语句是select \\* from user where username=#{username},但是如果usename为空怎么办?那么查询语句是select \\* from user where and sex=#{sex}。这是一个不正确的SQL 语句。怎么解决呢,看下面的where语句。

#### 2.2 动态SQL:if+where语句

从用户中选择*

用户名=#{用户名}

性别=#{性别}

如果包含标签具有返回值,则“where”标签知道插入“where”。此外,如果标签返回的内容以AND 或OR 开头,则会将其删除。

#### 2.3 动态SQL:if+set语句

同样,如果上面的查询SQL语句中包含where关键字,那么如果update操作中包含set关键字怎么办?

更新ID=\’updateUserById\’ 参数类型=\’用户\’

更新用户u

if test=\’用户名!=null 且用户名!=\’\’\’

u.用户名=#{用户名},

/如果

if test=\’sex !=null 且sex !=\’\’\’

u.性别=#{性别},

/如果

/放

其中id=#{id}

/更新

这样写的话,如果第一个条件username为空,那么SQL语句就变成:更新用户u set u.sex=? where id=?

如果第一个条件不为空,则SQL 语句如下所示:更新用户u 设置u.username=?u.sex=? 其中id=?

任何多余的逗号将被自动删除。

#### 2.4 理解动态SQL:choose(when,otherwise)语句

某些情况下,您可能不想使用所有查询条件,而是只要满足其中一个查询条件就只选择其中之一。这可以通过使用choose标签来解决,类似于Java的switch语句。

select id=\’selectUserByChoose\’ resultType=\’User\’ 参数类型=\’User\’

从用户中选择*

在哪里

选择

如果test=\’id !=\’\’ 且id !=null\’

id=#{id}

/什么时候

如果test=\’用户名!=\’\’ 且用户名!=null\’

用户名=#{用户名}

/什么时候

否则

性别=#{性别}

/否则

/选择

/在哪里

/选择

所以这里我们有三个条件:id、用户名、性别,并且只能选一个作为查询条件。

如果id不为空,则查询语句如下:从id=? 的用户中选择\\*

如果id为空,则检查username是否为空。如果不为空,则语句变为select \\* from user where username=?

如果用户名为空,则查询语句变为select \\* from user where sex=?

#### 2.5 理解动态SQL:trim语句

修剪标记是格式化标记,可以完成设置标记或位置标记的功能。

使用.trim重写上面第二条if+where语句。

选择id=\’selectUserByUsernameAndSex\’ resultType=\’user\’parameterType=\’User\’

从用户中选择*

修剪前缀=\’其中\’前缀覆盖=\’和|

if test=\’用户名!=null\’

用户名=#{用户名}

/如果

if test=\’性别!=null\’

性别=#{性别}

/如果

/修剪

/选择

前缀: 前缀

prefixoverride: 删除第一个and 或or

.用trim重写上面第三点的if+set语句。

!– 根据ID更新用户表中的数据–

更新ID=\’updateUserById\’ 参数类型=\’用户\’

更新用户u

修剪前缀=\’设置\’后缀覆盖=\’,\’

if test=\’用户名!=null 且用户名!=\’\’\’

u.用户名=#{用户名},

/如果

if test=\’sex !=null 且sex !=\’\’\’

u.性别=#{性别},

/如果

/修剪

其中id=#{id}

/更新

后缀: 后缀

suffixoverride:删除最后的逗号(也可以是其他标签,例如上面前缀中的and )

#### 2.6 动态SQL: SQL 片段

为了提高代码的复用性并简化代码,如果您经常使用某些SQL语句,则应该将这些代码提取出来并在使用时直接调用。

示例:如果您经常需要根据用户名和性别运行协作查询,请按如下方式提取此代码:

SQL ID=\’查询SQL\’

if test=\’用户名!=null 且用户名!=\’\’\’

用户名如#{用户名}

/如果

if test=\’sex!=null 且sex!=\’\’\’

性别=#{性别}

/如果

/sql

引用SQL 片段

从用户中选择*,其中1=1

选择id=\’selectUserByUsernameAndSex1\’ resultType=\’user\’parameterType=\’User\’

从用户中选择*

!– 自动去除多余的And或OR —

在哪里

!–SQL 片段介绍–

包括refid=\’querySQL\’/

/在哪里

/选择

选择id=\’selectUserByUsernameAndSex2\’ resultType=\’user\’parameterType=\’User\’

从用户中选择*

!– 删除多余的AND 或OR —

修剪前缀=\’WHERE\’ 前缀覆盖=\’AND|OR\’

!–SQL 片段介绍–

包括refid=\’querySQL\’/

/修剪

/选择

消息:

.为了增加片段的可重用性,最好基于单个表来定义SQL片段。

.SQL片段中不要包含where。

#### 2.7 动态SQL: 您可以使用foreach 语句!

https://www.cnblogs.com/hooly/p/9090167.html

[外部链接图像传输失败。源站点可能具有适当的反浸出机制。我们建议保存图片并直接上传(img-h2byxNqU-1586791414843) (C:\\Users\\Linbaba\\AppData\\Roaming\\Typora\\typora) -User Image\\1583071911084.png)]

需求:我需要查询users表中ID为1、2、3的用户。

SQL语句:select \\* from id=1 or id=2 or id=3的用户

从ID 为(1,2,3) 的用户中选择\\*

* 单参数类型列表

从#{item} 中id 的用户中选择*

我们整理了数百道**【运维技术栈面试题】**,成为您运维面试的得力助手。这将帮助您在面试时不慌不忙,并为高质量的面试做好准备。付费报价!

这些面试题涵盖了从Shell、MySQL到K8等云原生技术栈,不仅适合运维行业新人的面试需求,也适合对运维感兴趣的朋友是适合的。升职或换工作以增加薪水。 **

![](https://img-blog.csdnimg.cn/img_convert/7ccdcdcbeebcedad3fbe44bb4b4addbf.png)

本次访谈集内容为

* **174 运维工程师面试题**

* **128道k8s面试题**

* **108 个shell 脚本面试问题**

* **200 个Linux 面试问题**

* **51 个Docker 面试问题**

* **35 个Jenkis 面试问题**

* **78 MongoDB 面试问题**

* **17 Ansible 面试问题**

* **60 个Dubbo 面试问题**

* **53 次卡夫卡访谈**

* **18道mysql面试题**

* **40 个nginx 面试题**

* **77 个Redis 面试问题**

* **28 守门员**

**总共1000多道面试题,内容丰富、信息丰富**

* **174 运维工程师面试题**

1.什么是运维?

2、运维人员在工作场所经常需要与操作人员进行交互。运营人员做什么工作?

3. 给定300台服务器,如何管理它们?

4、我们简单解释一下raid0、raid1和raid5这两种运行模式的运行原理和特点。

5、LVS、Nginx、HAproxy有什么区别,工作中如何选择?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9. Tomcat 的三个端口8005、8009、8080 是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

工作中inx和HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9. Tomcat 的三个端口8005、8009、8080 是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

17.如何重置mysql root密码?

#MyBatis 以上内容为了解动态SQL_lt;include refid=“generalworkorderquery”gt;相关内容来源网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91220.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月21日
Next 2024年6月21日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注