mybatis传入多个参数,变成问号,如何处理??

乐之者v 2018-06-08 05:33:24
我在xml中的sql语句如下:

<select id="getTraceListByTime" resultMap="traceMap" statementType="STATEMENT">
select MOND_ID,INTERFACE_CODE,count(*) as REQUEST_COUNT, count( CASE WHEN ERRSTR is not null THEN 1 ELSE NULL END ) as FAILURE_COUNT
from ${table_name} where 1=1
and INTERFACE_CODE!='Svc_ProvisionRet'
and CREATE_DATE>= #{startTime,jdbcType=VARCHAR}
<![CDATA[ and CREATE_DATE< #{endTime,jdbcType=VARCHAR} ]]>
group by MOND_ID,INTERFACE_CODE
order by MOND_ID asc
</select>

而dao层的接口如下:

List<EsbTrace> getTraceListByTime(@Param("table_name") String table_name,
@Param("startTime") String startTime,@Param("endTime") String endTime);


第一个参数是动态表名,用了${ },后面两个是时间,用了#{} 。
然后mybatis的sql打印出来,后两个参数总是为?
select MOND_ID,INTERFACE_CODE,count(*) as REQUEST_COUNT, count( CASE WHEN ERRSTR is not null THEN 1 ELSE NULL END ) as FAILURE_COUNT from ESB_TRACE_20180507 where 1=1 and INTERFACE_CODE!='Svc_ProvisionRet' and CREATE_DATE>= ? and CREATE_DATE<= ? group by MOND_ID,INTERFACE_CODE order by MOND_ID asc
mybatis传入多个参数,只有第一个参数可以识别,其他几个参数变成问号,如何处理??
...全文
2816 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjsl__ 2018-06-11
  • 打赏
  • 举报
回复
prepareStatement就是这样的,?代表占位符,语句和参数是分开来的,可以用日志工具打印,但是也是分离的,sql语句+参数的形式,$相当于字符串拼接,不是prepareStatement的设置参数方法
诺丽果 2018-06-11
  • 打赏
  • 举报
回复
引用 6 楼 sinat_32502451 的回复:
[quote=引用 2 楼 weixin_39309867 的回复:] 你把三个参数都用#{},好像不能混着用,当只有一个参数的时候用${ }
我平常用#{}都没问题,真是迷糊。 这三个参数都用#{},结果所有参数都变成了问号。。[/quote]是因为你这三个参数都是中文吧?你换成数字试试
乐之者v 2018-06-11
  • 打赏
  • 举报
回复
引用 2 楼 weixin_39309867 的回复:
你把三个参数都用#{},好像不能混着用,当只有一个参数的时候用${ }
我平常用#{}都没问题,真是迷糊。 这三个参数都用#{},结果所有参数都变成了问号。。
perfect_red 2018-06-08
  • 打赏
  • 举报
回复
后两个参数是以点位符的形式存在 的,这也是$和#的区别,防止sql注入
诺丽果 2018-06-08
  • 打赏
  • 举报
回复 1
${ }和#{}的区别,就是#相当于对数据 加上 双引号,$相当于直接显示数据 #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".   $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id. 3. #方式能够很大程度防止sql注入。 4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象,例如传入表名. 6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
诺丽果 2018-06-08
  • 打赏
  • 举报
回复
你把三个参数都用#{},好像不能混着用,当只有一个参数的时候用${ }
Braska 2018-06-08
  • 打赏
  • 举报
回复
这是正常情况啊。 mybatis预编译的时候会把#{}内容用?占位符显示。 ${}内容原样显示。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧