关于mybatis中#和$占位符理解,导致sql语句的条件失效

您所在的位置:网站首页 sql语句中char 关于mybatis中#和$占位符理解,导致sql语句的条件失效

关于mybatis中#和$占位符理解,导致sql语句的条件失效

2023-06-08 04:23| 来源: 网络整理| 查看: 265

之前总觉得自己把mybatis、mysql学习的很好了,但是这次发现使用过程中,很多小细节还是掌握的不到位

做项目中,mybatis的占位符很常用,#和$的区别如下,

#占位符的特点 MyBatis处理 #{ } 占位符,使用的 JDBC 对象是 PreparedStatement 对象,执行sql语句的效率更高。使用 PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。#{ } 常常作为列值使用,位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。 $占位符的特点 MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。${ } 占位符中的数据是原模原样的,不会区分数据类型。${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。

这几点大多都耳熟能详,但是真到应用中还是不能使用的得心应手。

在使用过程中,有一个很大的坑需要注意,容易导致sql语句报错或者sql语句的条件无效: 比如要将查询出来的数据,按照某一列升序或降序排列;或者传入一个字段名称,在sql语句中使用。具体是哪一个列,是由前端或者后台传递过来。在这样的场景下,就必须要使用到 ${ }占位符,而不能使用#{ }占位符。因为:#{ }占位符使用的时候,如果传递过去的是一个字符串,那么最终生成的SQL语句,会自动使用双引号包裹住字符串。

这一点也对应$占位符的第四点,但是在使用过程中很容易忽略,我自己再mark一下。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3