返回

Mybatis占位符#和$到底怎么用?学废了才是真本事

后端

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 查询。

常见问题解答

  1. 如何防止使用 ${} 占位符时发生 SQL 注入?

答:使用 ${} 占位符时,需要手动进行参数类型转换,以防止 SQL 注入。

  1. #{} 占位符支持哪些数据类型?

答:#{} 占位符支持 Java 语言中所有基本数据类型,以及部分复杂类型,如 List、Map 等。

  1. ${} 占位符在动态 SQL 中的用途是什么?

答:${} 占位符在动态 SQL 中主要用于动态拼接 SQL 语句,根据不同的条件创建复杂的查询。

  1. #{} 和 ${} 占位符能否同时使用?

答:可以同时使用 #{} 和 ${} 占位符,但需要根据具体场景选择合适的使用方式。

  1. MyBatis 中还有其他占位符类型吗?

答:MyBatis 中没有其他占位符类型,#{} 和 ${} 是最常用的两种。