我是靠谱客的博主 微笑萝莉,最近开发中收集的这篇文章主要介绍Mybatis使用时,当查询参数存在于select条件时,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

下面查询,para参数是传入的,通过这个参数查询不同的列

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.#{para,jdbcType=VARCHAR}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

这时候是报错的Translating SQLException with SQL state '42000', error code '1064', message [You have an error in your SQL syntax;

这个错误网上给的解释和问题有点儿不同,细心查找下发现,因为#{para,jdbcType=VARCHAR}中,在形成语句的时候,会把para这个参数外面加上“”双引号,这本是防注入用的,当用在select查询字段中时,自然让数据库辨认不出来。这时可以使用相同的$来替代。

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.${para,jdbcType=VARCHAR}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

$同样传入参数,但不会给外面加上引号。运行。


引号问题解决,不过报新的错误

nested exception is org.apache.ibatis.binding.BindingException: Parameter 'VARCHAR' not found.

这其中,BindingException有多种原因,暂且不明,但是VARCHAR not found很好看,因为一般就是select了没有的字段,才会出现,这下再看这个para参数,后面的jdbcType被指定为VARCHATR,一定是这里出现问题。

这里考虑:

        Q1.jdbcType是什么作用?

        Q2.jdbcType应该什么时候用?

        Q3.jdbcType是如何实现的?

        A1:作用大致为确定参数的类型,一般常用的是    INTEGER    VARCHAR    TIMESTAMP    DATE


        A2:参数为空的时候,需要指定类型,不然会报错。

        A3:网上并无明确。


因此,去掉这个,再尝试。

<select id="getRecordByEqIdS" resultMap="BaseResultMap">
    SELECT el.${para}, el.pick_time
    FROM equipment_log el
    WHERE el.equipment_id = #{pkId,jdbcType=INTEGER}
    ORDER BY el.pick_time DESC
    limit #{count,jdbcType=INTEGER}
</select>

运行成功了。

推测:根据    Parameter 'VARCHAR' not found.这个来看,有可能在运行时加到了前面参数的后面,会被语句读到,但是一般不会读,但是在select中就现了原形了,姑且这样猜想,请懂得或者吊大的朋友留言说下。

最后

以上就是微笑萝莉为你收集整理的Mybatis使用时,当查询参数存在于select条件时的全部内容,希望文章能够帮你解决Mybatis使用时,当查询参数存在于select条件时所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部