mybatis中的#{}和${}区别,和使用场景
mybatis中的#{}和${}区别
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
2. $将传入的数据直接显示生成在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 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
mybatis本身的说明:
String Substitution
By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the
values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost
always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For
example, for ORDER BY, you might use something like this:
ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.
NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads
to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or
always perform your own escapes and checks.
从上文可以看出:
1.使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
这样做的好处是:更安全,更迅速,通常也是首选做法。
而且#{}格式的sql能够预编译,能再内存中保存sql语法,不用重新组装sql语法。
2.不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
此时MyBatis 不会修改或转义字符串。
这种方式类似于:
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
这种方式的缺点是: 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。
prepareStatement的预编译和防止SQL注入:
看这里https://blog.csdn.net/qq_43842093/article/details/121344931
相关文章
- Mybatis之基于XML的调用存储过程与手动回滚事务
- springboot中配置mybatis别名该怎么写?
- Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
- mybatis反向生成实体类、dao层以及映射文件
- SpringBoot使用Mybatis注解开发教程-分页-动态sql
- mybatis中oracle in>1000的处理
- spring boot:配置shardingsphere(sharding jdbc)使用druid数据源(druid 1.1.23 / sharding-jdbc 4.1.1 / mybatis / spring boot 2.3.3)
- mybatis中#{}和${}的区别
- Java_myBatis_全局配置文件
- Mybatis中$与#的区别
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)
- jdbc,mybatis,hibernate各自优缺点及区别
- Atitit mybatis业务流程配置化管理总结 目录 1. Mybatis1 2. 流程模型常见的bpm模式1 2.1. 活动task 流程,getway流程控制(分支跳转 循环等)1 3
- SpringBoot集成mybatis
- 【MyBatis笔记08】Mybatis中常用的一些操作
- 【MyBatis笔记11】Mybatis中的一级缓存和二级缓存
- Spring-Boot + Mybatis 多数据源配置
- 【项目实战】MyBatis映射文件中resultMap的空值映射的问题探讨
- 常用网络js链接大全(jQuery(3.4.1)、bootstrap、vue、ECharts、easyUI、React、maven、Mybatis、Spring、SpringMVC、Redis)
- mybatis和mybatis plus时间范围查询,数据库,sql,查询时间范围
- 全网详解MyBatis-Plus LambdaQueryWrapper的使用说明以及LambdaQueryWrapper和QueryWapper的区别
- Mybatis中#{}和${}的区别
- MyBatis之工作原理,简单实体的增加、修改、删除、查询_Mybatis-原理总结
- Mybatis源码分析之(六)mybatis拦截器(Interceptor)的实现原理