Mybatis Mapper.xml中字符串形式传参,逗号分隔 AND中拼接OR

导读:本篇文章讲解 Mybatis Mapper.xml中字符串形式传参,逗号分隔 AND中拼接OR,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

“宝~,你好久没更新了…”

“吃了吗? 睡了吗? 在干嘛呢?”
“宝~,被一个人牵动着情绪,真的很烦,你都不知道心疼人的吗?”
“你对一个喜欢你、关心你、担心你的人,就这么爱答不理吗?”

“宝啊,我生病了,我去输液,什么液?想你的液。”
在这里插入图片描述

一、业务场景

不好意思我要开启“舔狗模式”了,不过这不重要,重要的是实现的方法。
在这里插入图片描述

前端:

鲜花类型:页面搜索框多选。举个栗子:查询数据库中鲜花类型为:满天星或玫瑰或风信子的进货信息。(当然这个选框里面是可以选择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

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!