mybatis中$和#的区别

来源:互联网 发布:C语言case 编辑:程序博客网 时间:2024/05/16 10:34

mybatis是一款半自动的orm框架,它支持存储过程调用、触发器以及函数等,对sql语句可进行优化,是一款强大的针对数据库操作的框架。

昨天在项目开发时,突然发现有些请求每次只对数据库的同一张表的不同字段进行查询,并需要进行判断是否进行更新,这样其实只需要动态修改查询的字段名以及查询的条件就可以满足这一需求。因此想到了mybatis中的$和#的用法。

我们知道mybatis默认是支持sql预编译的,使用sql预编译的好处就是防注入,而使用sql预编译就需要使用#{}。mybatis中$和#最大的区别就是#传的值是带有引号的而$传值是没有引号的,还有就是#可以防止sql注入,$可以动态修改表名和字段名,一般建议能用#的就不用$。简单来说$是采用preparestatement #采用的是statement,使用preparestatement 适用于批量处理,针对一次性操作和statement查询速度几乎一致,preparestatement 会在数据库服务器上缓存,statement每次查询都是新创建没有使用缓存。想到这里突然想起sql的执行顺序。

我们知道sql语句编写一般都是在可视化软件上或者是cmd窗口下连接上数据库服务器,在数据库客户端编写sql语句需要先发送到数据库服务器在数据库服务器上先判断有没有缓存如果有直接执行,若没有缓存先进行编译检查、语义检查、权限判断等一系列操作后没有问题的情况下会对sql语句进行sql优化(数据库上的sql优化的作用很低,真正的sql优化还是要靠开发人员)再进行sql语句的执行,sql语句执行时一般是从from开始后从右向左执行也就是from--where--group by--having--select--order by, 经历完一系列操作后才会向客户端返回结果。

这样就比较的明了了,使用mybatis中的$不使用预编译,每次向数据库服务器发送的sql语句已经拼接完成了,这时需要数据库服务器进行检查编译等工作最后返回操作的结果。使用#可以使用预编译,每次向数据库服务器发送的sql语句都带有?占位符来防止sql注入并且在服务器上建立缓存以便下次操作时直接执行,但如果是一次性操作两者可以说速度上基本一样因为都需要进行sql编译、检查、判断权限等工作,在除第一次操作后preparestatement才会比statement的执行效率高。

原创粉丝点击