可能了解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’;
这里是运行日志:
从日志可以看出实际上是相当于执行了这段代码:
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
看看运行日志:
其实从运行日志就可以看出这里是直接拼接字符串的。
最后来总结一下#和$之间的区别吧:
#:在sql被调用时,传入的参数会被作为字符串,被加上引号,以预编译的方式传入,安全性高,作用是可以有效防止sql注入。
$:传入的内容会直接拼接,不会加上引号,可能存在sql注入的安全隐患。
所以其实可以这样说,能用#的地方就用#,但是如传入表名,需要排序的时候order by 字段 的 “字段名”的时候还是建议可以用$。
那么以上就是有关mybati中#,$的所有内容了,如果你还有兴趣了解更多java一些知识问答,就请记得关注本站消息哦。