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

目录
  • 通过出入Map参数作为条件进行查询
  • Mybatis查询传递Map参数
    • 使用场景
    • 传参
    • 持久层
    • 生成sql
    • 查询结果

通过出入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传参可读性差,参数难以控制等。以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis mapper.xml 区间查询条件详解

    目录 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 tk mybatis通用mapper,复杂and or条件查询 方式1:Weekend语法 方式2:通用example语法 mybatis mapper.xml 区间查询条件 对 null 和 " 分开进行判断 <select id="selectByExample" resultMap="BaseResultMap" parameterType=

  • 解决mybatis一对多查询resultMap只返回了一条记录问题

    问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外.就记录下这个问题 准备两个类:author(作者)和book(书),数据库创建对应的author->book一对多的数据 @Data public class Author { private Integer id; private String name; private String phone; private String address; private List<Book> book

  • Mybatis中的mapper模糊查询语句LIKE

    目录 Mybatis mapper模糊查询语句LIKE mapper 模糊查询语句报错 Mybatis mapper模糊查询语句LIKE 最近做学校安排的课程设计作业,用到SSM框架,在自己写mapper代码是遇到了模糊查询的问题 困扰好久 下面是我解决这个问题的方法,其他网上好多方法我尝试过却没有实现 下面试sql语句 select * from goodsinfo where goodsname like '%' #{goodsname} '%' 注意代码中的空格 空格 空格 #{ } 方式

  • mybatis的mapper特殊字符转移及动态SQL条件查询小结

    目录 前言 条件查询 快速入门 if标签 where标签 choose when otherwise标签 foreach标签 场景案例 前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于是就衍生出来ORM框架,如Mybatis,Hibernate,还有SpringBoot的,Spring Data JPA 条件查询 我们知道在mybatis map

  • MyBatis中map的应用与模糊查询实现代码

    目录 1.MyBatis中map的应用 1.1.应用场景 1.2.具体实现 1.3.注意点!!! 2.模糊查询 1.MyBatis中map的应用 1.1.应用场景 假设,实体类,或者数据库中的表,字段或者参数过多,应当考虑使用Map!!! 1.2.具体实现 //万能map int addUser2(Map<String,Object> map); <!--对象中的属性,可以直接取出来 parameterType=传递map中的key--> <insert id="a

  • mybatis-plus 查询传入参数Map,返回List<Map>方式

    目录 mybatis-plus 查询传入参数Map,返回List<Map> 1.mapper.xml 2.mapper.java 3.service 组装查询条件 mybatis-plus 基本使用 首先我们需要创建一个数据库表 然后创建一个Spring Boot项目 我们来演示几个基本的查询方法 再演示几个删除方法 再演示插入方法 mybatis-plus 查询传入参数Map,返回List<Map> 原因有时实体类属性不够用,又不想写自定义VO了,所以用map,这样直接返回前台用

  • MyBatis的模糊查询mapper.xml的写法讲解

    目录 MyBatis模糊查询mapper.xml的写法 1.直接传参 2.针对MySQL数据库的语句 3.适用于所有数据库的则采用MyBatis的bind元素 MyBatis在xml中模糊查询的常用的3种方式 MyBatis模糊查询mapper.xml的写法 模糊查询语句不建议使用${}的方式,还是建议采用MyBatis自带的#{}方式,#{}是预加载的方式运行的,比较安全,${}方式可以用但是有SQL注入的风险!!! 1.直接传参 在controller类中 String id = "%&qu

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

    目录 通过出入Map参数作为条件进行查询 Mybatis查询传递Map参数 使用场景 传参 持久层 生成sql 查询结果 通过出入Map参数作为条件进行查询 映射文件中查询语句部分: <!--通过map进行条件查询--> <select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">     select * from Products where pro

  • mybatis动态sql之Map参数的讲解

    mybatis 动态sql之Map参数 Mapper文件: <mapper namespace="com.cn.shoje.oa.modules.logistics.dao.PurcDao"> <select id="findAll" parameterType="Map" resultType="Purchase"> select * from prod_purchase where 1=1 <

  • springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能

    完整案例: SpringBoot + laypage分页 + 模糊查询 完整案例 下面在通过实例代码介绍下springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能,内容如下所示: 调用接口Controller类 @ApiOperation("查询列表") @PostMapping("/selectList") public Result selectList(@RequestBody User_InfoListRequest us

  • MyBatis传入集合 list 数组 map参数的写法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性

  • mybatis打印SQL,并显示参数的实例

    在maven的pom.xml里面添加一下依赖: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>3.2.4.RELEASE</spring.version> <version.slf4j>1.7.6</version.slf4j> <version.logback>1.

  • mybatis调用mysql存储过程(返回参数,单结果集,多结果集)

    目录 一.接收一个返回值 注意事项: 存储过程主要分成三类: 二.接收list结果集 三.返回多个结果集 四.第二种配置也可以 一.接收一个返回值 使用Map接收返回参数,output参数放在传入的param中 创建表 DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`

  • mybatis foreach 循环 list(map)实例

    目录 foreach 循环 list(map) 整体需求就是 mybatis.foreach循环如下 使用foreach处理list中的map Mapper中的方法是 Mapper.xml的sql是 foreach 循环 list(map) 直接上代码: 整体需求就是 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { private Map maps; private List li

  • Mybatis中传递多个参数的4种方法总结

    前言 现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate.使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数.面对各种复杂的业务场景,传递参数也是一种学问. 下面给大家总结了以下几种多参数传递的方法. 方法1:顺序传参法 #{}里面的数字代表你传入参数的顺序. 这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错. 方法2:@Param注解传参法 #{}里面的名称对应的是注解 @Param括号里面修饰的名称. 这种方法在参数不多的情况还

  • Mybatis 动态表名+Map参数传递+批量操作详解

    需求: 之前项目一个变动,需要对3张mysql数据库表数据进行清洗,3张表表名不同,表结构完全相同,需要对这3张表进行相同的增.改.查动作,一开始比较紧急先对一张表进行操作,后来复制了3个一样的 service.dao.mapper等.后来对代码进行优化,研究了一下动态表名的处理. 1,查询操作: 查询操作只需要传入动态表名的时候,传递参数仍然是map mapper.xml内,需要使用statementType="STATEMENT",采用非预编译模式 mapper.xml内,动态表名

  • 详解Mybatis中万能的Map和模糊查询写法

    1.万能的Map 假设,我们的实体类,或者数据库中的表,字段或参数过多,我们接口参数以前用的是实体类,现在考虑使用下Map! 接口: //万能的Map int addUser2(Map<String,Object> map); mapper.xml: <!--Map中的key--> <insert id="addUser2" parameterType="map"> insert into mybatis.user (id,nam

随机推荐