4.1-CRUD+动态SQL【复用】+防注入:参数解析与引用机制
处理数据访问参数的基础知识点直接关系到 SQL 执行的安全性和规范性一、#{}预编译参数绑定推荐使用#{}是 MyBatis 参数引用的核心方式其底层实现和核心特性是该知识点的重点底层实现MyBatis 在解析#{}时会将其转换为 JDBC 中的PreparedStatement预编译语句对象的占位符?后续参数值会通过setXxx()方法如setInt()、setString()传入占位符而不是直接嵌入 SQL 语句三大核心特性推荐使用的原因防 SQL 注入核心优势由于参数值是作为独立数据传入预编译语句而非 SQL 语句的组成部分即使参数中包含恶意 SQL 片段如 or 11 --也会被当作普通字符串处理无法执行恶意逻辑有效保障数据库安全自动类型转换MyBatis 会自动匹配 Java 方法参数类型与数据库表字段类型完成数据类型的转换如 Java 的Integer转换为数据库的INTString转换为VARCHAR无需开发者手动处理类型兼容问题兼容性强支持各种复杂参数类型基本数据类型、实体类、Map、注解指定参数名等适配绝大多数业务场景二、${}字符串直接拼接慎用这是与#{}对应的参数引用方式也是该知识点的重要补充需明确其特性和适用场景底层实现MyBatis 解析${}时会直接将传入的参数值进行字符串拼接嵌入到 SQL 语句的对应位置底层对应 JDBC 的Statement普通语句对象无预编译处理核心特性局限性为主无防 SQL 注入能力核心风险参数值直接拼接进 SQL若参数包含恶意 SQL 片段会被直接执行存在严重的数据库安全隐患无自动类型转换仅做纯字符串拼接需要开发者手动保证参数类型与数据库字段类型兼容否则会抛出 SQL 执行异常支持动态占位唯一优势可以动态指定 SQL 中的表名、列名、排序字段、查询条件关键字如ASC/DESC等这些场景#{}无法满足因为预编译占位符?不能替代表名、列名等 SQL 关键字适用场景仅限特殊需求仅用于无需考虑注入风险如参数由系统内部生成非用户输入的动态 SQL 场景示例!-- 动态指定排序字段和排序方式只能使用${} -- select idgetUserList resultTypecom.example.entity.User SELECT * FROM user ORDER BY ${sortColumn} ${sortType} /select三、核心价值与注意事项核心价值掌握该机制能保证 SQL 执行的安全性避免核心的 SQL 注入漏洞合理选择#{}和${}既能满足常规业务需求又能适配特殊动态 SQL 场景提升开发的规范性和灵活性必备注意事项开发中优先使用#{}这是 MyBatis 的推荐最佳实践最大限度保障系统安全使用${}时必须做严格的参数校验和过滤禁止直接使用用户输入的参数作为${}的取值避免注入风险总结核心知识点MyBatis 参数解析与引用机制#{}预编译绑定 vs${}字符串拼接重点#{}的防注入、自动类型转换特性以及${}的适用场景和风险开发原则优先用#{}慎用${}并做好参数校验
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409996.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!