返回
Mybatis占位符#和$到底怎么用?学废了才是真本事
后端
2023-08-08 23:08:03
MyBatis 占位符:#{} 和 ${} 的详尽指南
在使用 MyBatis 框架进行数据库交互时,占位符是至关重要的工具,可帮助我们编写动态 SQL 查询并防止 SQL 注入。MyBatis 提供了两种主要的占位符:#{} 和 ${},它们具有不同的用途和优点。
#{} 占位符
#{} 占位符用于占位未知参数,这些参数将在运行时由 MyBatis 动态替换。它通过防止恶意代码注入 SQL 查询,确保应用程序的安全性。
用法:
- 占位未知参数:使用 #{} 占位符可有效防止 SQL 注入。MyBatis 会自动将 #{} 占位符替换为相应的值,而不会将参数直接拼接在 SQL 语句中。
- 参数类型转换:MyBatis 可以自动转换 #{} 占位符中参数的类型,以匹配 SQL 语句中的字段类型。
- 传入多个参数:当需要向 SQL 语句中传入多个参数时,可以使用 #{} 占位符和 in() 函数结合使用。
示例代码:
// 查询 id 为 1、2、3 的用户
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.findByIds", Arrays.asList(1, 2, 3));
${} 占位符
${} 占位符用于占位已知参数,这些参数在编译时就已确定,不经 MyBatis 处理,直接拼接在 SQL 语句中。
用法:
- 占位已知参数:使用 ${} 占位符可以动态生成 SQL 语句,因为它直接将参数值拼接在 SQL 语句中。
- 动态拼接 SQL 语句:${} 占位符还可以用于动态拼接 SQL 语句,根据不同的条件创建复杂的查询。
示例代码:
// 查询名称包含 "张三" 的用户
String name = "张三";
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.findByName", name);
#{} 和 ${} 的区别
特性 | #{} | ${} |
---|---|---|
用途 | 占位未知参数 | 占位已知参数 |
SQL 注入 | 防止 SQL 注入 | 不防止 SQL 注入 |
参数类型转换 | 自动转换 | 手动转换 |
动态 SQL | 支持 | 支持 |
总结
在 MyBatis 开发中,选择合适的占位符至关重要。#{} 占位符用于占位未知参数,防止 SQL 注入;而 ${} 占位符用于占位已知参数,实现动态 SQL 查询。通过了解它们之间的区别并根据实际情况合理使用,可以编写安全高效的 MyBatis SQL 查询。
常见问题解答
- 如何防止使用 ${} 占位符时发生 SQL 注入?
答:使用 ${} 占位符时,需要手动进行参数类型转换,以防止 SQL 注入。
- #{} 占位符支持哪些数据类型?
答:#{} 占位符支持 Java 语言中所有基本数据类型,以及部分复杂类型,如 List、Map 等。
- ${} 占位符在动态 SQL 中的用途是什么?
答:${} 占位符在动态 SQL 中主要用于动态拼接 SQL 语句,根据不同的条件创建复杂的查询。
- #{} 和 ${} 占位符能否同时使用?
答:可以同时使用 #{} 和 ${} 占位符,但需要根据具体场景选择合适的使用方式。
- MyBatis 中还有其他占位符类型吗?
答:MyBatis 中没有其他占位符类型,#{} 和 ${} 是最常用的两种。