经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
Mybatis如何通过出入Map参数作为条件进行查询
来源:jb51  时间:2022/6/27 10:53:55  对本文有异议

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

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

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

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

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

测试代码:

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

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

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

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

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

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

Mybatis查询传递Map参数

使用场景

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

  1. <select id="getObjectByMap" parameterType="map" resultMap="BaseResultMap">
  2. select
  3. <include refid="Base_Column_List" />
  4. from
  5. s_app
  6. <where>
  7. <foreach collection="map" item="v" index="k" separator="and">
  8. <if test="v != null and v != ''">
  9. ${k} = #{v}
  10. </if>
  11. <!--<choose>
  12. <when test="v instanceof integer">
  13. <if test="v != null">
  14. ${k} = #{v}
  15. </if>
  16. </when>
  17. <when test="v instanceof list">
  18. <if test="v != null and v.size() > 0">
  19. ${k} in
  20. <foreach collection="list" item="v" separator="," open="(" close=")">
  21. #{v}
  22. </foreach>
  23. </if>
  24. </when>
  25. <when test="v instanceof array">
  26. <if test="v != null and v.length > 0">
  27. ${k} in
  28. <foreach collection="array" item="v" separator="," open="(" close=")">
  29. #{v}
  30. </foreach>
  31. </if>
  32. </when>
  33. <otherwise>
  34. <if test="v != null and v != ''">
  35. ${k} = #{v}
  36. </if>
  37. </otherwise>
  38. </choose>-->
  39. </foreach>
  40. </where>
  41. </select>

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

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

传参

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

持久层

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

生成sql

查询结果

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号