zoukankan      html  css  js  c++  java
  • 每日一记-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类型,这种机制很令人不解。

    备注下

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

  • 相关阅读:
    vue递归组件的实现
    Vue左滑组件slider的实现
    vue 全局引用jq(打包后可能会遇到的问题)
    vue simple框架打包遇到报错问题
    HTML5 FormData实现文件上传实例
    长连接、短连接、长轮询和WebSocket
    解决axios IE11 Promise对象未定义
    Html5的map在实际使用中遇到的问题及解决方案
    Js参数RSA加密传输,jsencrypt.js的使用
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/smallFishs/p/6183677.html
Copyright © 2011-2022 走看看