sql不为空就查作为条件查询_MyBatis动态SQL中多条件查询

本文介绍在进行数据库多条件查询时如何避免因部分条件为空导致的SQL语法错误,并通过具体示例展示了如何在UserMapper.xml中智能处理and和where关键字。

在前面内容的基础上,我们在UserDao中编写一个方法

037928f5581244862bd13c4f4740b860.png

在UserMappper中编写

c1e3ad4e7eb6d588f80108d1144a7443.png

编写测试类,这个测试类的查询条件全部不为空

bf44e303ded08ae0ec670e626bf86b9b.png

查看结果

3a1fe1ad6bb05f8dc07e918fb3a1e823.png

我们设置部分条件是空的,例如用户角色为空

我们修改下测试部分的代码

29e60aad05f3498b924ef046c13c18b7.png

运行测试代码我们发现

3919806e94c8e8aa54da63cdfa605ab6.png

那么这个结果是否正确呢?我们查看日志信息

617983d65a3b15321a1f3b061574dd77.png

将查询语句摘取出来,里面的问号改成我们的查询数据,在数据库命令行中执行

dbc99c761a542996cccecf90c13cc31d.png

发现是有数据的,很显然我们的代码有问题

这是因为在进行多条件查询的是否,用户并不一定会完整地输入所有的查询条件,这个时候就会有漏洞出现。

我们修改UserMappper.xml

940ccc848dec1130f0020c55a490527d.png

我们再查看测试结果,符合我们的预想

777cf98ea1fbf77c02b9e3dc0f55c129.png

我们改造上一个例子,在UserDao中添加如下方法

6141fe6460228843d451e41ea20e8791.png

编写UserMapper.xml

bc907bcfd437069470c7a76ed16dcc53.png

编写测试方法

45db45f0ad6e8362466050086da262a6.png

查看运行结果

49442d2022624e890491a2d104bb905c.png

发现有错误的信息,具体的错误信息是语句语法错误,其中

select * from s_user where and u.userRole=?

这句话很明显的错误。为了解决这个问题同样需要智能处理and和where。

e13354b3502069d612aba8816b5d0463.png

再次查看运行结果

350bd555e9ba2170d6a962a87bd9dc70.png

结果是对的 空指针的异常是因为我们没有查询role,同时也没做处理,我们做一下更改

6c77442489c97e3b5b5696f8c6967e42.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值