Mybatis中#号和$号的区别和对比
2023-12-02 20:48:25
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中有着不同的区别和对比。我们应该根据不同的场景来选择使用#{}还是{}。