mybatis中的#和$的区别是什么?它们分别有什么作用?

2020-04-16 11:45:16 java常见问答 5458

可能了解java软件开发的朋友对mybatis也会有一定的研究,因为它作为一个半自动的对象关系映射框架,的确是还相当有知名度的,多多少少还是会用到它,那么你清楚mybatis中#跟$之间有什么区别吗?理解它们的作用是什么吗?

我们先来看一下#,在mybatis中如何实现:

<mapper namespace="com.xh.dao">
 <select id="getCount" parameterType="String" resultType="int">
 select count(*) from user where age = #{value}
 </select>
 </mapper>

那么#{value}就会被传入的内容给替换掉了,替换的时候将传入的内容会被当成字符串的,加上引号:例如传入的内容为23,sql语句会变为select count(*) from user where age= ‘23’;

这里是运行日志:

mybatis中的#和$的区别是什么?它们分别有什么作用?

从日志可以看出实际上是相当于执行了这段代码:

String sql = "select count(*) from user where age = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, “23”);

其实通过调用preparedStatement的setString方法传入参数可以有效的防止sql注入,安全性会更高。但是如果只传入一个参数那么该参数的名字是可以随意取的。

下面再来看一下$:

<mapper namespace="com.xh.dao">
 <select id="getCount" parameterType="String" resultType="int">
 select count(*) from ${value}
 </select>
</mapper>

这时,${value}会被传入的内容替换,注意此处是直接替换的,不会加上引号。比如说传入的内容为 user 那么sql语句变为:select count(*) from user

看看运行日志:

mybatis中的#和$的区别是什么?它们分别有什么作用?

其实从运行日志就可以看出这里是直接拼接字符串的。

最后来总结一下#和$之间的区别吧:

#:在sql被调用时,传入的参数会被作为字符串,被加上引号,以预编译的方式传入,安全性高,作用是可以有效防止sql注入。

$:传入的内容会直接拼接,不会加上引号,可能存在sql注入的安全隐患。

所以其实可以这样说,能用#的地方就用#,但是如传入表名,需要排序的时候order by 字段 的 “字段名”的时候还是建议可以用$。

那么以上就是有关mybati中#,$的所有内容了,如果你还有兴趣了解更多java一些知识问答,就请记得关注本站消息哦。