day10-2-mybatis动态sql详解

2021/10/20 2:09:39

本文主要是介绍day10-2-mybatis动态sql详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 30 - 多条件查询分析
    • 为什么要用OGNL
    • 第一个要讲的是:if where
    • 多条件查询
    • 演示 - EmpMapper
    • 演示 - EmpMapper.xml
    • 演示 - 测试
  • 31 - 动态SQL之if
    • 回到京东页面
    • 演示 - 查询结果
    • 总结
    • 举个例子理解
    • 总结 - 多条件查询的细节问题 - 【重点】
    • 引子
    • if标签
    • 报错
    • 报错总结 - 【重点】
    • 解决报错
    • 多条件查询sql语句拼接的and问题 - 【重点】
  • 32 - 动态sql之where
    • 总结 - if标签作用
    • where标签
    • 总结 - where标签 【重要】
  • 33 - 动态SQL之trim
    • if标签和where标签的and小问题 【重要】
    • trim标签
    • 总结 - trim标签 【重要】
    • 演示 - trim标签
    • sql拼接的新问题 - 【重要】
    • trim标签的细节 【重要】
  • 34 - 动态sql之choose
    • set标签 - 修改操作
    • choose标签
    • 演示choose标签 - mapper接口
    • 演示choose标签 - xml映射文件
    • 演示choose标签 - 测试代码
    • choose标签总结 【重要】
    • 举例子
    • 测试报错
    • 报错解决 【重要】
    • 测试第二次报错
    • 修改报错

30 - 多条件查询分析

  • 动态SQL
  • 缓存机制
  • 逆向工程:代码生成器
  • page-helper分页插件
  • ssm框架整合

动态sql语句非常重要

image-20211019221025597

image-20211019221220450

为什么要用OGNL

因为xml当中,很多东西写不了。

举个例子,xml当中&这种符号就写不了,需要写成它的实体,叫做amp;

&lt&gt是大于小于。

OGNL对咱们的常用符号,做了简单设置。

比如说xml当中&是amp;,OGNL当中&就是and,OGNL当中||就是or

第一个要讲的是:if where

创建一个java项目:

image-20211019221846069

多条件查询

image-20211019222003121

提问:我设置的条件越多,展示的结果越精确,对不对。

提问:我设置的条件,都应该出现在我的SQL语句中,我没有设置的条件,应不应该出现在我的SQL语句中?

答案是不能够,绝对不能够,我们现在解释一下这个问题。

演示 - EmpMapper

image-20211019223046875

创建了一个EmpMapper,里面有一个多条件查询的方法。

演示 - EmpMapper.xml

image-20211019223227606

演示 - 测试

image-20211019223459155

image-20211019223748057

执行查询的结果如下:

image-20211019223820988

31 - 动态SQL之if

image-20211019224013286

这个时候查询,还能够查询出来吗?

回到京东页面

没有选择的条件,就不能够出现在SQL语句的条件列表中。

如果所有的条件,可能都是一个实体类的属性,你不赋值,它都有默认值的。

如果你没有选择的条件,这些条件还在条件列表中,那么你查询的时候,这些默认值很有可能影响查询结果。

演示 - 查询结果

image-20211019225211562

总结

image-20211019225305763

举个例子理解

比如说有个页面,多条件查询一般都是在列表,基本上都是如此的。

假如说页面当中有四个条件,eid,ename,age,sex。

  • eid是一个文本框,没有设置条件,就是文本框没有值。

  • ename是一个文本框,没有设置条件,就是文本框没有值。

  • age是一个文本框,没有设置条件,就是文本框没有值。

  • sex是一个单选框,没有选择任何一个单选框,就是没有设置。

所以服务器要做个判断,判断eid、ename、age、sex是否有值。

有值就给sql拼接,没有值就不拼接。

这个对参数的判断,是必不可少。

这个判断的逻辑应该是什么呢?

客户端给服务器传输数据有一定规则。

提交表单,表单的action中有请求路径。

第一种情况,不经过form表单,直接地址栏输入请求路径,没有传输任何数据,直接访问服务器。

表单都没有提交,表单当中的数据更没有提交,代表没有一个条件。

没有一个条件的情况下,我们是要查询的是所有的数据。

这个时候服务器获得的,所有参数的值,都是null。

第二种情况,你传了数据,但是没有值。

我在页面当中文本框当中什么都没有写,这个意思就是传了数据,但是没有值。文本框的值是空字符串。

这个时候服务器获得的,是空字符串。

  • 文本框不输入,默认值就是空字符串。

  • 单选框和复选框,要么选,要么不选,不选就是null,跟没有传是一样的效果。

所以,服务器判断的时候,是需要判断是否是null或空字符串

总结 - 多条件查询的细节问题 - 【重点】

第一个总结,页面中设置了条件,服务器处理的时候,才可以加入到sql语句中。页面中没有设置条件,服务器处理的时候,一定不要加入到sql语句中。这是因为服务器获取的默认值是会影响查询结果的。

第二个总结,在服务器判断要不要加入到sql语句当中的时候,文本框字段需要判断是否不是null或字符串,单选框复选框判断是否不是null。

引子

如果我们只是学了jdbc,就是逐个使用if代码去判断。

那么我们在mybatis当中,应该怎么做呢?有没有简便的做法。

if标签

image-20211019231530327

报错

上面的映射文件配置后,执行测试,如下报错:

image-20211019231719867

报错总结 - 【重点】

image-20211019231804888

解决报错

第一,修改数据库sex字段的赋值。

image-20211019231857445

第二,修改sql语句。

image-20211019232004023

第三,修改测试代码。

image-20211019232033006

第四,查看执行结果:

image-20211019232055454

第五,去掉一个条件,测试xml中if是否生效。

image-20211019232217222

测试证明生效。

多条件查询sql语句拼接的and问题 - 【重点】

image-20211019232352160

如果上面的sql语句,多条件查询的时候,没有eid这个条件。

那么sql语句就会有点问题,sql语句当中就会多了一个and,语法就错误了。

image-20211019232515066

这个问题,怎么解决呢?

image-20211019232614749

这样测试,就没有问题了。

32 - 动态sql之where

总结 - if标签作用

image-20211019233030933

where标签

原来的sql语句,是这个样子的:

image-20211019233114273

我们把上面的where 1 = 1这句话去掉。

然后把所有的if标签,都放在where标签内,如下所示:

image-20211019233316238

where标签的作用,就是添加where关键字,并且去掉多余的and。一般情况下,用在我们写条件的地方。

总结 - where标签 【重要】

image-20211019233447470

33 - 动态SQL之trim

if标签和where标签的and小问题 【重要】

image-20211019233811785

假设,我们的sql语句,是如上的写法,and都加在后面啊。

如果sex条件不符合,不拼接到sql中。

那么整个sql语句最终就会多个and。

就会报错,如下所示:

image-20211019233926376

这个问题应该怎么解决呢?

trim标签

image-20211019234045940

我们把where标签,换成trim标签,包裹我们的if代码。

trim标签有4个属性。

  • prefix
  • suffix
  • prefixOverrides
  • suffixOverrides

总结 - trim标签 【重要】

image-20211019234347080

演示 - trim标签

image-20211019234459480

如上图蓝色部分的属性,在这个sql中,是不需要设置的。

image-20211019234529297

测试执行,结果正常:

image-20211019234557088

sql拼接的新问题 - 【重要】

image-20211019234812098

如上图所示,上面的sql,如果标号1的条件不符合,sql的最后就多了一个or,如果标号2的条件不符合,sql的最后就多了一个and。

我去,动态拼接的sql,有可能多一个and,也有可能多一个or,这时候咋办呢?

trim标签的细节 【重要】

为了解决上面的问题,在trim标签当中,是这样的写法:

image-20211019235017684

34 - 动态sql之choose

set标签 - 修改操作

image-20211019235158293

简单看看,不演示了。

  • set就是把多余的逗号去掉
  • 用trim标签,也可以实现。
  • 一般情况下,用得不多。

choose标签

image-20211019235753835

choose标签相当于if..else if..else if..else

choose标签中的when,就相当于else if

choose标签中的otherwise,就相当于else

演示choose标签 - mapper接口

image-20211020000025236

演示choose标签 - xml映射文件

image-20211020000538035

演示choose标签 - 测试代码

image-20211020000656996

测试结果:

image-20211020000716067

image-20211020000906327

image-20211020000848036

choose标签总结 【重要】

image-20211020001152642

举例子

写一个添加操作,添加性别的时候,从客户端获得的是0和1,添加的时候做一个简单的判断。

如果获得是0,数据库添加为女,如果获得是1,数据库添加为男。

mapper接口如下:

image-20211020001435311

xml当中的sql语句:

image-20211020001642115

测试代码:

image-20211020001743407

测试报错

image-20211020001836135

sql语句当中,男这个字,没有加上单引号。

问题的原因,就是我们在xml当中的when标签内的字符串,没有加上单引号:

image-20211020001930725

报错解决 【重要】

image-20211020002029284

测试第二次报错

image-20211020002208606

这是因为我们的emp实体类当中有五个属性,还有一个did属性。

我们在insert的时候,values当中必须要跟每一个字段全部对应。

修改报错

修改我们的sql语句,变成如下的状态:

第一种方式:

image-20211020002333857

第二种方式:

image-20211020002459156

修改过后,执行正确:

image-20211020002909980

数据库当中,数据添加成功。

image-20211020002933035



这篇关于day10-2-mybatis动态sql详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程