“宝~,你好久没更新了…”
“吃了吗? 睡了吗? 在干嘛呢?”
“宝~,被一个人牵动着情绪,真的很烦,你都不知道心疼人的吗?”
“你对一个喜欢你、关心你、担心你的人,就这么爱答不理吗?”
“宝啊,我生病了,我去输液,什么液?想你的液。”
一、业务场景
不好意思我要开启“舔狗模式”了,不过这不重要,重要的是实现的方法。
前端:
鲜花类型:页面搜索框多选。举个栗子:查询数据库中鲜花类型为:满天星或玫瑰或风信子的进货信息。(当然这个选框里面是可以选择n个的)
前端以字符串形式传参(长这样:1,2,3)
后端:
未创建中间表,进货鲜花类型(下图中type字段)以一个varchar类型字段维护,多个值以逗号分隔。
举个栗子:
同时进货满天星、玫瑰 则type存储为:1,2
同时进货满天星、玫瑰、风信子 则type存储为:1,2,3
别diss为啥要用一个字段去存储,原系统已经这样了,就问在此基础上能不能查。
老板:“就问你在此基础上能不能查!”
wshanshi:“不能查,这tm…怎么查!!!”
老板:“wshanshi啊,待会下班你去下财务处…”
我…我去下财务处…我裂开了啊…
查肯定是能查的,为了不去财务处,那必须能查啊!
二、业务需求
分析业务需求,实质上就是and中拼接or,并且这个or的数量是未知的。
想法:分割用foreach、查找匹配使用FIND_IN_SET函数。
第一反应:将字符串按照逗号进行分割,然后匹配数据库表中type字段包含1 或者包含2 或者包含3的数据。
印象中xml 中foreach标签处理集合多些,传入字符串如何处理?字符串变为集合?
邪魅一笑…好像也可以,真香!
不多bb了,上代码。
三、具体实现
楼主写的demo较为简便,仅体现该方法的处理,勿喷哈。
3.1、 实体类
@Data
public class Demo implements Serializable {
/**
* 编号
*/
private Integer id;
/**
* 类型
*/
private String type;
}
3.2、Mapper接口
@Mapper
public interface DemoMapper {
List<Demo> getAllDemoByTypeStr(@Param("str") String str);
}
3.3、Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wshanshi.test.mapper.DemoMapper">
<resultMap id="BaseResultMap" type="com.wshanshi.test.entity.Demo">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="type" jdbcType="VARCHAR" property="type"/>
</resultMap>
<select id="getAllDemoByTypeStr" resultMap="BaseResultMap">
SELECT * FROM demo where 1 = 1
<if test="str != null and str != '' ">
AND
<foreach collection="str.split(',')" index="index" item="item" open="(" separator="OR"
close=")">
FIND_IN_SET(#{item}, type)
</foreach>
</if>
</select>
</mapper>
注意:foreach标签中字符串按照逗号分割,通过or进行拼接。
<foreach collection="str.split(',')" index="index" item="item" open="(" separator="OR"
close=")">
FIND_IN_SET(#{item}, type)
</foreach>
3.4、Service接口
public interface DemoService {
List<Demo> getAllDemoByNameStr(String str);
}
3.5、ServiceImpl实现类
@Service
public class DemoServiceImpl implements DemoService {
@Resource
private DemoMapper demoMapper;
@Override
public List<Demo> getAllDemoByNameStr(String str) {
return demoMapper.getAllDemoByTypeStr(str);
}
}
3.6、Controller类
@RestController
@RequestMapping("/demo")
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("/getAllDemoByTypeStr")
public List<Demo> getAllDemoByTypeStr(String str) {
return demoService.getAllDemoByNameStr(str);
}
}
四、postman自测
模拟传参str=”1,2,3,4″请求该接口。会查询出type字段包含1或2或3或4的值
传单个值也没问题
可以看到控制台打印出的sql
demo代码:戳我下载
害,散会散会。我去找我的宝~了…
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115766.html