mybatis传值到XML里面,为什么参数类型是HashMap可以获取到参数值,Map就不行?

图片说明
图片说明

[图片说明
[图片说明

第一二张图是别人写的代码,三四张是我写的代码,一开始我也像他那样在XML文件里面传入的参数配置为java.util.Map,虽然能正常运行,但是却不能传入参数,打印出来的SQL,传入的参数显示为“?”当我把传入的参数类型改为java.util.HashMap又能看到传入的参数为正常,请问为什么,我们代码基本都是一样的啊。

6个回答

情况一:parameterType="HashMap"
图片说明
图片说明
结果:sql正常执行,参数传递与接收正常。

情况二:parameterType="Map"
图片说明
图片说明
结果:sql正常执行,参数传递与接收正常

完整sql如图:
图片说明

初步推断你对mybatis的两个符号不知道区别:“#”、“$”
--使用“#”拼接参数的话,打印的sql执行log,就会出现“?”,并且能看到sql的log的下方有形如这样的参数【==> Parameters: 1(String), 0(Integer), 10(Integer)】
例如:假设startTime的值为‘2017-12-16', select * from user where create_time > #{startTime}
执行结果是:
==> Preparing : select * from user where create_time > ?
==> Parameters: 2017-12-16(String)

--使用“$”拼接参数的话,打印的sql是连带参数一起打印出来。
例如:假设startTime的值为‘2017-12-16', select * from user where create_time > #{startTime}
==> Preparing : select * from user where create_time > '2017-12-16'

maoadd
maoadd 虽然不是这个问题,但是那么详细的解答还是谢谢,之前那个问题可能是编辑器哪里出了问题,关了编辑器重启就好了
2 年多之前 回复
weixin_36146275
weixin_316529 纠正:--使用“$”拼接参数的话,打印的sql是连带参数一起打印出来。 例如:假设startTime的值为‘2017-12-16', select * from user where create_time > ${startTime}
2 年多之前 回复

因为Map是一个接口,想要接受结果必须使用这个接口的实现类。Map那么多实现类,如果你不知道具体用哪个实现类而只告诉mybatis用map的任何实现类都可以,那mybatis接收不到结果或者结果错了,是你负责还是mybatis负责?

qq_36520153
书生_AABB 666
2 年多之前 回复

你试试这样写:

 <select id="select" parameterType="java.util.Map" resultMap="RM">
        SELECT ... 
        FROM ....
        WHERE id=#{parameterMap.openid}
    </select>


SELECT ...
FROM ....
WHERE id=#{parameterMap.openid}
你试试看看

SELECT ...
FROM ....
WHERE id=#{parameterMap.openid}

Map只是一个接口,hashmap是实现类

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问