Mybatis 查询 之 foreach 遍历 Map

2 篇文章 0 订阅
1 篇文章 0 订阅

需求:查询数据库中的一条记录,where 条件为给定map中的值 ,返回的记录以map格式保存(也可以通过创建实体类来保存,这里不做重点)

分析:使用 foreach 元素遍历 map 中的所有 key 进行匹配

这里设定给定查询条件的map的引用变量为 paramMap

方法一:将paramMap放到另一个map中,当成参数进行传值

  1. 测试类:
@Autowired
DemoMapper demoMapper;    

Map<String, Map> map = new HashMap<>(); //用来存放paramMap
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id",1); // 给定的查询条件
map.put("paramMap",paramMap); 
Map<String, Object> demo = demoMapper.getDemoByMap(map);
  1. mapper 接口:
Map<String,Object> getDemoByMap(Map map);
  1. mapper.xml 文件
<select id="getDemoByMap" parameterType="map" resultType="java.util.HashMap">
    select * from demo
    <where>
        <if test="paramMap != null and paramMap.size() > 0">
            <foreach collection="paramMap" index="key" item="value" separator="and">
                ${key} = #{value}
            </foreach>
        </if>
    </where>
</select>

注意:这里面{key}前面需要使用$,不用#

参数说明:

#{param} :以预编译的形式,将参数设置到sql语句中,PreparedStatement,防止sql注入;

${param} :取出值直接拼装在sql中,有sql注入安全隐患;

这里的SQL语句拼接起来后可以在控制台看到如下输出:

Preparing: select * from demo WHERE id = ?
# 这里的id是paramMap中的key,如果xml中使用的是#而不是$,这里的id就会变成?

方法一存在缺点:需要创建一个map,用它来存放paramMap

方法二:使用 @Param

  1. 测试类:
@Autowired
DemoMapper demoMapper;    

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id",1);
Map<String, Object> demo = demoMapper.getDemoByMap(paramMap);
  1. mapper 接口:
Map<String,Object> getDemoByMap(@Param("paramMap") paramMap);
  1. mapper.xml 文件:
<select id="getDemoByMap" parameterType="map" resultType="hashMap">
    select * from demo
    <where>
        <if test="paramMap != null and paramMap.size() > 0">
            <foreach collection="paramMap" index="key" item="value" separator="and">
                ${key} = #{value}
            </foreach>
        </if>
    </where>
</select>
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值