mybatis #{} ${}的区别

这篇博客探讨了在编程中使用模板字符串时遇到的问题,特别是涉及到数组索引的表达式。文章通过示例说明了为何`${dateRange[#{count}

#{} 它会解析成字符串 例如: 

and (analysis_create_time between  #{dateRange[#{count}]} and #{dateRange[#{countSec}]})  ===》 dateRange['0']  导致程序报错 数组里的索引值是字符串

and (analysis_create_time between #{dateRange[${count}]} and #{dateRange[${countSec}]}) ===》 dateRange[0]  成功允许

一、基础信息 数据集名称:Bottle Fin实例分割数据集 图片数量: 训练集:4418张图片 验证集:1104张图片 总计:5522张图片 分类类别: - 类别0: 数字0 - 类别1: 数字1 - 类别2: 数字2 - 类别3: 数字3 - 类别4: 数字4 - 类别5: 数字5 - 类别6: Bottle Fin 标注格式:YOLO格式,包含多边形坐标,适用于实例分割任务。 数据格式:图片格式常见如JPEG或PNG,具体未指定。 二、适用场景 实例分割AI模型开发:数据集支持实例分割任务,帮助构建能够精确识别和分割图像中多个对象的AI模型,适用于对象检测和分割应用。 工业自动化与质量控制:可能应用于制造、物流或零售领域,用于自动化检测和分类物体,提升生产效率。 计算机视觉研究:支持实例分割算法的学术研究,促进目标检测和分割技术的创新。 教育与实践培训:可用于高校或培训机构的计算机视觉课程,作为实例分割任务的实践资源,帮助学生理解多类别分割。 三、数据集优势 多类别设计:包含7个不同类别,涵盖数字和Bottle Fin对象,增强模型对多样对象的识别和分割能力。 高质量标注:标注采用YOLO格式的多边形坐标,确保分割边界的精确性,提升模型训练效果。 数据规模适中:拥有超过5500张图片,提供充足的样本用于模型训练和验证,支持稳健的AI开发。 即插即用兼容性:标注格式直接兼容主流深度学习框架(如YOLO),便于快速集成到各种实例分割项目中。
MyBatis 中,`#{}` 和 `${}` 是两种用于处理参数的语法,它们的主要区别在于 SQL 注入安全性、参数处理方式以及使用场景。 - `#{}` 是预编译占位符,MyBatis 会将其视为 JDBC `PreparedStatement` 中的参数标记。使用 `#{}` 时,MyBatis 会自动对参数进行类型处理和安全转义,从而有效防止 SQL 注入问题。这种写法适用于大多数参数传递场景,尤其是在需要将用户输入作为查询条件时[^1]。 ```sql SELECT * FROM users WHERE username = #{username}; ``` 上述语句中,`#{username}` 会被替换为 `?`,然后通过 `PreparedStatement` 设置参数值。 - `${}` 是字符串替换占位符,MyBatis 会将其直接替换为参数值,不做任何转义或预编译处理。这种方式适用于需要动态拼接 SQL 片段的场景,例如动态表名、列名等。但正因为不做处理,`${}` 存在 SQL 注入风险,使用时需格外谨慎。 ```sql SELECT * FROM ${tableName} WHERE id = #{id}; ``` 在该语句中,`${tableName}` 会被直接替换为传入的表名字符串,而 `#{id}` 则仍作为安全参数处理。 ### 使用建议 - 优先使用 `#{}` 来处理参数,以确保 SQL 安全性。 - 只有在确实需要拼接 SQL 片段(如动态表名)时,才使用 `${}`,并且应确保传入的值是可信的或经过严格校验。 ### 示例对比 使用 `#{}` 的 SQL 语句: ```sql SELECT * FROM users WHERE id = #{id}; ``` 如果 `id = 123`,最终生成的 SQL 是: ```sql SELECT * FROM users WHERE id = ?; -- 参数绑定:123 ``` 使用 `${}` 的 SQL 语句: ```sql SELECT * FROM ${tableName} WHERE id = #{id}; ``` 如果 `tableName = "users"`,`id = 123`,最终生成的 SQL 是: ```sql SELECT * FROM users WHERE id = ?; -- 参数绑定:123 ``` ### 总结 `#{}` 和 `${}` 的核心区别在于是否进行预编译处理。`#{}` 提供了更高的安全性和更稳定的参数处理机制,而 `${}` 则提供了更灵活但风险更高的字符串替换功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值