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

 

都知道#{}是以占位符的形式${}是直接拼接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,

     
            and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
        

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中这样写

     
            and tjksallstatus.zk_zpzlcode=#{ksallstatuszkzpzl,jdbcType=VARCHAR}
        

所需时间是6秒

由此肯定了我的猜想,

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

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

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

 

 

 

 

你可能感兴趣的:(java)