需求:查询数据库中的一条记录,where 条件为给定map中的值 ,返回的记录以map格式保存(也可以通过创建实体类来保存,这里不做重点)
分析:使用 foreach 元素遍历 map 中的所有 key 进行匹配
这里设定给定查询条件的map的引用变量为 paramMap
方法一:将paramMap放到另一个map中,当成参数进行传值
- 测试类:
@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);
- mapper 接口:
Map<String,Object> getDemoByMap(Map map);
- 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
- 测试类:
@Autowired
DemoMapper demoMapper;
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id",1);
Map<String, Object> demo = demoMapper.getDemoByMap(paramMap);
- mapper 接口:
Map<String,Object> getDemoByMap(@Param("paramMap") paramMap);
- 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>