先来回顾一下mybatis 核心概念 :
mapper中使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
执行SQL:select * from emp where name = #{employeeName}
参数:employeeName=>Smith
解析后执行的SQL(我们打开debug日志控制台可以看到):select * from emp where name =
#方式能够很大程度防止sql注入
有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY $将传入的数据直接显示生成在sql中
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
执行SQL:select * from emp where name = ${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL(我们打开debug日志控制台可以看到):select * from emp where name =Smith
总结:#方式能够很大程度防止sql注入,$方式无法防止Sql注入;$方式一般用于传入数据库对象,使用$要么不允许用户输入这些字段,要么自行转义并检验。一般能用#的就别用$。
再回顾下JDBC执行流程:
结合JDBC的执行过程,不难发现归根结底的区别是CreateStatement 和 PrepareStatement 的区别。
每周一句:找到做事的准则、模式和反模式。准则:原则应用到实践中;模式:你应该做的;反模式:你不应该做的。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有