mybatis中使用map传值和遍历时问题整理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值