springboot,mybatis中#{}和${}传递参数的问题

探讨在SpringBoot+MyBatis环境下,使用MyBatis与直接执行SQL在查询速度上的差异,特别是在数字字符串作为查询条件时,揭示了#{xxx}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

都知道#{}是以占位符的形式${}是直接拼接sql的形式

情况说明:我在mybatis中数字字符串查询数据是我在navicate中执行sql慢了一倍,经过多次尝试发现mybatis传入数字字符串时和直接执行sql条件是and xxx=331的执行时间一样,而用and xxx='331'查询则要快了一倍

也就是说当我传递的参数是数字字符串时,我在mapper中这样写‘${xxx}’的结果比#{xxx}快了一倍,希望有大神给与指引

 

 

--我是两张表连接查询,根据ksno字段建立的连接,不加索引时他是表连接慢,当我给ksno添加上非聚集性索引时,查询很快,但是我不加索引时为什么传递数字字符串时用#{xxx}和在数据库中执行and xxx=331的时间是一样的,而比and xxx='331'慢了一倍

 

下面是我的情况:

环境:springboot+mybatis,

mappper中写法如下,传递参数的类型是map,

     <if test="ksallstatuszkzpzl != null and ksallstatuszkzpzl !=''">
            and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
        </if>

java代码中写法如下,其中ksallstatusspzpzl是字符串类型

if(StringUtils.isNotEmpty(ksallstatuszkzpzl) ){
			paras.put("ksallstatuszkzpzl",ksallstatuszkzpzl);
		}

在不加索引,数据量为100w条,查出的总数也是100w条,传入参数值为字符串’331‘的情况下(数据库中字段zk_zpzlcode为varchar类型

mybatis执行时间12秒,直接执行sql只需6秒

在经过多种情况下的尝试发现mybatis执行的sql为占位符的形式

AND tjksallstatus.zk_zpzlcode =?,传地参数为打印出为:

2019-08-10 09:15:00.103 [http-nio-8080-exec-4] DEBUG com.zr.dao.KsxxMapper.selectAllStatusByKsxx_page - ==> Parameters: 331(String)

发现此种执行结果所需时间和直接执行sql,AND tjksallstatus.zk_zpzlcode =331执行的时间一样都是12秒

而直接执行sql,AND tjksallstatus.zk_zpzlcode =‘331’所需时间只需6秒

由此猜想mybatis把我传递的字符串331按照数字331到数据库中做了比较

如果mapper中这样写

     <if test="ksallstatuszkzpzl != null and ksallstatuszkzpzl !=''">
            and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
        </if>

所需时间是6秒

由此肯定了我的猜想,

那么如果比较名字,我在比较名字的时候输入331他会不会页按照数字比较呢,比较身份证号是不是也是按照数字比较呢?

希望大神给与指导,这是不是mybatis的锅

--我是两张表连接查询,根据ksno字段建立的连接,不加索引时他是表连接慢,当我给ksno添加上非聚集性索引时,查询很快,但是我不加索引时为什么传递数字字符串时用#{xxx}和在数据库中执行and xxx=331的时间是一样的,而比and xxx='331'慢了一倍

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值