Springboot-根据前端请求查找后端接口-mybatis,foreach-实现多条件查询

项目场景:

管理平台,告警配置板块,需要查询返回多个数据信息,其中需要对订阅人的查询返回功能进行优化,将原本的只能输入一个订阅人名字进行查询优化为输入多个订阅人名,以英文逗号分隔,返回包含他们的结果


问题描述:

Spring架构的上手实操与idea的基础小功能使用

查找接口

一开始拿到这个优化需求也是非常手足无措的感觉,不像自己课程设计时写的代码,一般就几个java文件,哪个功能对应哪些行代码都非常清楚。在导师的指点下,需要从查找功能调用的接口开始做起。
本项目前端为Webstorm+Nginx,后端为idea开发,项目在本地启动后,浏览器端进入告警配置界面,F12进入控制台,选择网络,记录XMLHttpRequest请求,随后在告警配置的待优化输入框输入数据进行查找。因为会向后台请求数据,这时候我们刚刚打开的控制台就会记录我们的请求,如下图所示。

Springboot-根据前端请求查找后端接口-mybatis,foreach-实现多条件查询_第1张图片

重点关注XHR已完成加载,下方的是前后端通信的一些Ajax交互,但这条信息的价值在于寻找后端接口,红框处部分,说明userConfigList为相应的函数,后半部分则是传递过去用于查找的关键字信息

函数定位

找到了后端函数名,开始在idea内查找相应的interface与其service
给你一个很大的项目,其实一上手也很懵,这时候ctrl+N可以快速在文件范围内查找

Springboot-根据前端请求查找后端接口-mybatis,foreach-实现多条件查询_第2张图片
点击进去,就能看到函数的参数名,函数体,可以发现,我们这一步是在controller层,ctrl+shift+左键点击进入,我们可以看到这个userConfigList内部调用的mapper层接口,如下图所示。

controller内部
那么对这个selectUserAllConfigList进行右击,点击文件查找,我们就可以找到这个函数的内部逻辑,这样
我们就进入了xml文件,mybatis的sql查找语句,到这一步,我们的问题溯源就算结束了


解决方案与反思

阅读sql可以发现,原功能实现是基于对传入的一个单一字符串进行模糊查找,主要
使用like关键字与concat函数将%与传入的字符串进行拼接,实现了一个模糊查找

 AND (IFNULL(s.login_id,'') LIKE CONCAT('%',#{subscribeName},'%')
               

那么最便捷的改进思路在于,接口参数不变,同样为String字符串,其中包括用户在查询多个订阅人时用于中间分隔的英文逗号,我们需要使用sql的foreach,在foreach头部再使用spilit按逗号分隔,此时可以将多个订阅人名关键词逐一查找,类似的方法,同样可以用在多IP,多设备名等多关键字查找

<if test="subscribeName!='' and subscribeName!=null and subscribeName != 'null'">
            and IFNULL(s.login_id,'')  in
            <foreach collection="subscribeName.split(',')" item="subscribeName" separator="," open="(" close=")">
                #{subscribeName}
            </foreach>
 </if>

经过尝试,上述代码有效,实现了多订阅人名同时查找

你可能感兴趣的:(J2EE,spring,intellij-idea,java,mybatis,sql)