返回

Mybatis中#号和$号的区别和对比

后端

Mybatis作为一款优秀的持久层框架,在Java开发中广泛使用。在Mybatis中,我们经常使用#{}和${}两种符号来书写SQL语句,但它们之间存在着一些区别和对比。

首先,#{}是预编译语句的占位符,而${}是字符串拼接。预编译语句是一种将SQL语句和参数分开提交给数据库的方式,可以有效地防止SQL注入攻击。而字符串拼接则是将SQL语句和参数直接拼接成一个字符串,然后提交给数据库,这种方式容易受到SQL注入攻击。

其次,#{}中的参数是安全的,而{}中的参数是不安全的。#{}中的参数会在预编译阶段被替换为问号(?),然后数据库会根据问号(?)的个数和类型来绑定参数。这种方式可以有效地防止SQL注入攻击,因为数据库不会执行包含非法的字符或语法错误的SQL语句。而{}中的参数则直接被替换成字符串,然后提交给数据库,这种方式容易受到SQL注入攻击,因为数据库会执行包含非法的字符或语法错误的SQL语句。

最后,#{}的使用场景更广泛,而{}的使用场景比较有限。#{}可以用于任何类型的参数,包括字符串、数字、日期、时间、布尔值等。而{}只能用于字符串类型的参数。

综上所述,#{}和{}在Mybatis中有着不同的区别和对比。#{}是预编译语句的占位符,而{}是字符串拼接。#{}中的参数是安全的,而{}中的参数是不安全的。#{}的使用场景更广泛,而{}的使用场景比较有限。

为了进一步验证#{}和{}之间的区别,我们可以基于MybatisPlus做验证。MybatisPlus是一个基于Mybatis的持久层框架,它提供了更加丰富的功能和更加友好的使用体验。在MybatisPlus中,我们也可以使用#{}和{}来书写SQL语句,但需要注意的是,MybatisPlus默认使用#{}作为预编译语句的占位符,而${}作为字符串拼接。

// 使用#{}作为预编译语句的占位符
String sql = "select * from user where id = #{id}";
// 使用${}作为字符串拼接
String sql = "select * from user where id = '${id}'";

如果我们使用#{}作为预编译语句的占位符,那么MybatisPlus会将id参数替换为问号(?),然后数据库会根据问号(?)的个数和类型来绑定参数。这种方式可以有效地防止SQL注入攻击,因为数据库不会执行包含非法的字符或语法错误的SQL语句。

如果我们使用${}作为字符串拼接,那么MybatisPlus会将id参数直接替换成字符串,然后提交给数据库。这种方式容易受到SQL注入攻击,因为数据库会执行包含非法的字符或语法错误的SQL语句。

因此,在MybatisPlus中,我们应该尽量使用#{}作为预编译语句的占位符,而避免使用${}作为字符串拼接。

除了上述的区别和对比之外,#{}和${}还有一些其他的使用场景。

  • #{}可以用于获取MybatisPlus自动生成的ID。例如,在插入数据时,我们可以使用#{}来获取自动生成的ID。
int id = mapper.insert(entity);
  • {}可以用于获取Java代码中的变量值。例如,我们可以使用{}来获取当前登录用户的ID。
String sql = "select * from user where id = ${userId}";

总之,#{}和{}在Mybatis中有着不同的区别和对比。我们应该根据不同的场景来选择使用#{}还是{}。