什么是MyBatis
MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是#mybatis#。
MyBatis支持定制化SQL、存储过程以及高级映射等多种特性,单纯从代码上来看,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及手动处理结果集。而且MyBatis的使用也非常方便,可以通过简单的XML或注解来配置和映射数据信息。
`#` 和 `$`的区别:
1.# 会进行预编译,而且会进行类型匹配,参数是在编译之后填充进去的,所以不需要加上单引号;
2.$ 不会进行数据类型匹配,只是一种单纯的字符串拼接,所以要自己手动加上单引号,否则最终拼接出来的 SQL语句会有问题。不过也要看具体的使用场景,如果参数是列名,就不用加单引号;
3.`#` 能够预防 SQL 注入问题,$ 不能;
4.当需要遇到将数据库的字段名作为参数传递时,应该使用用 $。
基本用法
我们先来了解一下 `#`和 `$` 的基本用法。这两个都可以进行动态 SQL 的拼接,但用法上略微有一些差异。
我们先来看 `#` 的用法:
select * from t_user where name = #{param}
如果想执行相同的 SQL,用 $ 写法如下:
select * from t_user where name = '${param}'
眼尖的小伙伴可能已经发现,使用 `$` 比使用 `#` 多了一对单引号,为什么要这样呢?这里就涉及到了两者的第一个区别了:
# 会进行预编译,而且会进行类型匹配,参数是在编译之后填充进去的,所以不需要加上单引号;
$ 不会进行数据类型的匹配,只是单纯地进行字符串的拼接,所以要自己手动加上单引号,否则最终拼接出来的SQL语句就不对了。
用过JDBC的小伙伴可能会知道,这就跟JDBC中的PrepareStatement和Statement的区别是一样的,使用 `#` 就相当于使用 PrepareStatement,而使用 `$` 就相当于使用 Statement。
相比于 $ ,#有一个重要的作用,那就是可以防止SQL注入!
变量传递时,必须使用#。使用 #{} 就等于使用了JDBC 中 PrepareStatement 这种占位符的形式,既可以提高SQL的执行效率,又可以防止SQL注入等问题。
$ 只是一种简单的字符串拼接,要特别小心 SQL注入的问题。如果我们在项目中使用了$,那么可以自定义过滤器或者通过Druid等工具,来防止SQL注入。
如果在一个场景中,既能使用 # 又能使用 $,那么建议首选 #。
标签:JDBC,区别,什么,使用,拼接,SQL,MyBatis,单引号 From: https://www.cnblogs.com/qian-fen/p/17101405.html