每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗

碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗?

背景

初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int、String等作为parameterType只能传入单个值,要想传入多个值,可以使用List、Map或者自定义的数据类型等等,但是今日看到了一份别人的代码上,parameterType为String,但是却用来接收了俩个传入值,而且查询的结果并没有出错,很是疑惑。

实验

在网上搜了很久,都没有搜到跟这个相关的问题,关于传入多个参数都是使用的Lst、Map或者Bean来进行的,所以为了验证一下自己写了个小程序,用log4j在控制台打印出SQL语句查看一下结果。

部分主要代码如下:

实体类Notice的属性
private int id;
private String content;
private String createTime;
构造方法、getter/setter
*************************************************************
NoticeMapper.xml一个方法
<!-- 更新公告 -->
<update id="updateNotice" parameterType="String">
update Notice
<set>
<if test="content!=null">
content = #{content},
</if>
<if test="createTime!=null">
createTime = #{createTime}
</if>
</set>
where ID = #{id}
</update>
*************************************************************
BaseDao中update方法
public int update(String sqlId, Object object) {
return getSqlSession().update(sqlId, object);
}
*************************************************************
NoticeServiceImpl中相关方法
private Map<String,Object> params;
params.put("ID", 3);
params.put("content", "1213");
getBaseDao().update("updateNotice", params);

以上代码运行之后,在控制台输出的sql语句为:

08-11 20:13:12.699 [DubboServerHandler-192.168.51.1:8075-thread-5] DEBUG - ==>  Preparing: update Notice SET content = ? where ID = ?
08-11 20:13:12.699 [DubboServerHandler-192.168.51.1:8075-thread-5] DEBUG - ==> Parameters: 1213(String), 3(String)
08-11 20:13:12.701 [DubboServerHandler-192.168.51.1:8075-thread-5] DEBUG - <== Updates: 1

可以看到Mybatis的动态SQL语句执行成功了,返回了Updates: 1,拼装的sql语句:

update Notice SET content = ? where ID = ?
1213(String), 3(String)

实验结果

实验之后更加迷惑了:

  1. 因为parameterType的值为String,但是我传递了一个有俩个值(ID,content)的Map<String,Object>类型竟然传递进去了,而且传递的值都被正确的接收了,语句也执行成功了。
  2. 更值得注意的是控制台输出的ID值: 3(String) ,我传递ID竟然从INT类型自动转换成了String类型,这种机制很令人不解。

备注下

这种问题去请教下大神去,然后去翻翻源码看

上一篇:spring管理SessionFactory中XML配置


下一篇:iphone ios12通过创建APN开启ipv6