mybatis中使用map传值和遍历时问题整理
结论
直接使用map中的k-v,mapper中方法参数不能加注解;
遍历map中k-v,mapper中方法参数需要加注解;
sql中表名,列名从map中获取时,取值用${}而不是#{}
userMapper.java
//mapper
User getUser(Map<String, String> map);
调用
Map<String, String> map = new HashMap<>();
map.put("name", "张三");
map.put("pwd", "123456");
User user1 = mapper.getUser(map);
System.out.println(user1);
1.直接使用map中的k-v值
<select id="getUser" resultType="User">
select *
from user
<where>
name = #{name} and pwd = #{pwd}
</where>
</select>
mapper中参数map不加注解@Param(“map”),正常
结果:User{id=2, name='张三', pwd='123456'}
加注解@Param(“map”),报错如下
Cause: org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [map, param1]
2.遍历map中的值
<select id="getUser" parameterType="java.util.Map" resultType="User">
select *
from user
<where>
<foreach collection="map" index="k" item="v" separator="and">
#{k} = #{v}
</foreach>
</where>
</select>
(1) mapper中参数map不加注解@Param(“map”)
报错:The expression 'map' evaluated to a null value.
(2) 只加注解
不报错,但查询不到结果,log4j输出如下
[com.lu.dao.UserMapper.getUser]-==> Preparing: select * from user WHERE ? = ? and ? = ?
[com.lu.dao.UserMapper.getUser]-==> Parameters: name(String), 张三(String), pwd(String), 123456(String)
[com.lu.dao.UserMapper.getUser]-<== Total: 0
null
(3) 加注解且列名使用${}
<select id="getUser" parameterType="java.util.Map" resultType="User">
select *
from user
<where>
<foreach collection="map" index="k" item="v" separator="and">
${k} = #{v}
</foreach>
</where>
</select>
正常访问
[com.lu.dao.UserMapper.getUser]-==> Preparing: select * from user WHERE name = ? and pwd = ?
[com.lu.dao.UserMapper.getUser]-==> Parameters: 张三(String), 123456(String)
[com.lu.dao.UserMapper.getUser]-<== Total: 1
User{id=2, name='张三', pwd='123456'}
如果xml中的表名也是传值过来的,获取也要用${}
mybatis版本 3.5.2