Mybatis如何通过出入Map参数作为条件进行查询

 更新时间:2022年06月27日 08:43:32   作者:走路的猫头鹰  
这篇文章主要介绍了Mybatis如何通过出入Map参数作为条件进行查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

通过出入Map参数作为条件进行查询

映射文件中查询语句部分:

<!--通过map进行条件查询-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
    select * from Products where prod_price = #{prodPrice} and prod_desc = #{prodDesc}
</select>

接口文件中对应的查询方法:

//输入参数为Map的条件查询
Product selectByMap(Map<String,Object> map);

测试代码:

//...前面有创建sqlSessionFactory对象和SQLSession对象的代码
Map<String,Object> map = new HashMap<>();
map.put("prodPrice","11.99");
map.put("prodDesc","18 inch teddy bear, comes with cap and jacket");
ProductsMapper mapper = sqlSession.getMapper(ProductsMapper.class);
Product product = mapper.selectByMap(map);
System.out.println(product);

map中的key值与映射文件中的select语句#{}占位符中的值需要一一对应

在mybatis中,任何传入的参数都会被对应封装成Map集合,然后会以map的key=value形式取值。

对传入的参数是List集合,mybatis会对list集合进行特殊处理,其取值方式通过list[下标]或collection[下标]的方式入参取值。

对于数组,Mybatis同样会做特殊处理,它会对数组采用array[下标]的方式入参取值。

<!--如果是List集合(或set集合)就如下入参取值-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
    select * from Products where prod_price = #{list[0]} and prod_desc = #{collection[1]}
</select>
<!--如果是数组就如下入参取值-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
    select * from Products where prod_price = #{array[0]} and prod_desc = #{array[1]}
</select>

Mybatis查询传递Map参数

使用场景

mybaits传递Map查询数据,choose里面的判断根据自己的map参数类型自行使用,这里传的value是Object类型,这里用不到

<select id="getObjectByMap" parameterType="map" resultMap="BaseResultMap">
        select
            <include refid="Base_Column_List" />
        from
            s_app
        <where>
            <foreach collection="map" item="v" index="k" separator="and">
                <if test="v != null and v != ''">
                    ${k} = #{v}
                </if>
                <!--<choose>
                    <when test="v instanceof integer">
                        <if test="v != null">
                            ${k} = #{v}
                        </if>
                    </when>
                    <when test="v instanceof list">
                        <if test="v != null and v.size() > 0">
                            ${k} in
                            <foreach collection="list" item="v" separator="," open="(" close=")">
                                #{v}
                            </foreach>
                        </if>
                    </when>
                    <when test="v instanceof array">
                        <if test="v != null and v.length > 0">
                            ${k} in
                            <foreach collection="array" item="v" separator="," open="(" close=")">
                                #{v}
                            </foreach>
                        </if>
                    </when>
                    <otherwise>
                        <if test="v != null and v != ''">
                            ${k} = #{v}
                        </if>
                    </otherwise>
                </choose>-->
            </foreach>
        </where>
    </select>

这里需要注意的一点是${K},首先map的key一定要跟数据表字段保持一致。如果这里的${K}写成了#{K}则生成的sql语句如下所示:

程序不会报错,条件无效。${}和#{}的区别相信大家都了解,简单概括就是一个是替换占位符,一个是当做参数传入

传参

    @PostMapping({"demo"})
    public AjaxResult demo(String appNo, String name) {
        Map map = Map.of("app_no", appNo, "cust_name", name);
        SApp objectByMap = service.getObjectByMap(map);
        return success(objectByMap);
    }

持久层

public interface SAppMapper extends BaseMapper<SApp> {
    SApp getObjectByMap(@Param("map") Map<String, Object> map);
}

生成sql

查询结果

总结:这样的好处是参数的个数不固定、参数的类型不固定,适用的场景较多。缺点也很明显map传参可读性差,参数难以控制等。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解XML,Object,Json转换与Xstream的使用

    详解XML,Object,Json转换与Xstream的使用

    这篇文章主要介绍了详解XML,Object,Json转换与Xstream的使用的相关资料,需要的朋友可以参考下
    2017-02-02
  • Spring的事务控制实现方法

    Spring的事务控制实现方法

    这篇文章主要为大家详细介绍了Spring的事务控制实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 引入QQ邮箱发送验证码进行安全校验功能实现

    引入QQ邮箱发送验证码进行安全校验功能实现

    最近遇到这样的需求用户输入自己的邮箱,点击获取验证码,后台会发送一封邮件到对应邮箱中,怎么实现呢?下面小编给大家带来了引入QQ邮箱发送验证码进行安全校验功能,需要的朋友可以参考下
    2023-02-02
  • MyBatis使用<foreach>标签报错问题及解决

    MyBatis使用<foreach>标签报错问题及解决

    这篇文章主要介绍了MyBatis使用<foreach>标签报错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Mybatis的xml中使用if/else标签的具体使用

    Mybatis的xml中使用if/else标签的具体使用

    本文主要介绍了Mybatis的xml中使用if/else标签的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • spring aop pointcut 添加多个execution方式

    spring aop pointcut 添加多个execution方式

    这篇文章主要介绍了spring aop pointcut 添加多个execution方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • httpclient getPoolEntryBlocking连接池方法源码解读

    httpclient getPoolEntryBlocking连接池方法源码解读

    这篇文章主要为大家介绍了httpclient getPoolEntryBlocking连接池方法源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 实例详解MyBatis-plus自动填充功能

    实例详解MyBatis-plus自动填充功能

    每次对数据进行新增、删除、修改时都需要对这些字段进行设置,虽然新增时间和修改时间可以使用数据库的时间,但是新增人和修改人就不能使用这样的功能,下面小编给大家介绍下MyBatis-plus自动填充功能的实例代码,感兴趣的朋友一起看看吧
    2022-01-01
  • Java中将接口返回的字节串转为文件详解

    Java中将接口返回的字节串转为文件详解

    这篇文章主要给大家介绍了关于Java中将接口返回的字节串转为文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • java oshi如何查看cpu信息

    java oshi如何查看cpu信息

    这篇文章主要介绍了java oshi如何查看cpu信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论