--- $符 仅仅为一个纯碎的string替换,在动态 SQL 解析阶段将会进行变量替换。会发生sql注入的问题
--- #符 动态SQL解析为一个JDBC预编译语句(prepared statement)的参数标记符,sql语句中的参数位会被预编译为占位符 ‘?’ 。变量的替换是在 DBMS 中,不会发生sql注入的问题
特殊点 :
参数经过拼接,例 :
拼接.png--- #符 :mybatis会将被拼接的orgs拦截,导致参数取不到;
--- $符 :则可以取到参数值
预编译的作用:
1.防止SQL注入 :
使用预编译,而其后注入的参数将不会再进行SQL编译。也就是说其后注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数,参数中的or或者and 等就不是SQL语法 保留字了。
2.预编译阶段可以优化 sql 的执行 :
一次编译、多次运行,省去了解析优化等过程。
vans.png
网友评论