Q:#{}和${}有什么区别吗?
- #{}是一个预处理占位符,它可以防止SQL注入攻击。当使用#{}时,MyBatis会将其转换为JDBC的?占位符,并在执行时动态替换参数值。这种方式会自动处理数据类型,并且在必要时对参数值进行引号处理,从而提高了安全性。
- ${}则是直接将参数值嵌入到SQL语句中,不会进行预处理或类型转换。这种方式不会防止SQL注入,因此在使用时需要特别小心。
td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
| 特性 | #{} | ${} |
| 底层实现 | PreparedStatement (SQL预编译) |
字符串直接替换 |
| 安全性 | 防 SQL 注入 | 存在 SQL 注入风险 |
| 适用场景 | 大多数参数场景 | 动态表名、列名、排序 |
| 性能 | 预编译缓存,性能更高 | 每次生成新 SQL |
| 参数处理 | 自动类型转换 | 直接拼接,需手动处理 |
$的使用场景:在动态表名,列名的情况下使用。
Q:Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态 拼接sql的功能,Mybatis提供了9种动态sql标签 trim|where|set|foreach|if|choose|when|otherwise|bind。
其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此 来完成动态sql的功能。
Q:Spring支持的几种bean的作用域 Scope
Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的 Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基 于web的Spring ApplicationContext情形下有效。
单例bean(Singleton)在多线程情况下可能会出现多个线程同时修改bean状态,或者线程A修改的数据被线程B给覆盖了的情况