什么是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注入。

如果在一个场景中,既能使用 # 又能使用 $,那么建议首选 #。

MyBatis中的#和$有什么区别的更多相关文章

  1. (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)

    原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...

  2. Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...

  3. 在mybatis中resultMap与resultType的区别

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMa ...

  4. Mybatis中$和#取数据的区别

    Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...

  5. Mybatis中#{}和${}传参的区别

    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111&qu ...

  6. 记录下mybatis中#{}和${}传参的区别

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...

  7. MyBatis中resultType和resultMap的区别

    resultType和resultMap功能类似  ,都是返回对象信息  ,但是resultMap要更强大一些 ,可自定义.因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名 ...

  8. mybatis中xml文件的${}和#{}区别

    之前的笔记:#{}相当于JDBC的? ${}是字符串连接符,如果入参为普通类型{}中只写value 在项目中要实现所有业务批量提交的功能,实现方式,把表名,表主键字段当做参数传递,在xml文件中全部使 ...

  9. mybatis 中javaType和OfType 的区别

    JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型.pojo类: publiccla ...

  10. mybatis中查询使用#{}和${}的区别

    ${}中的变量什么值,就会简单的替代变量,不会做处理 比如delete * from tb_label where name=${labelname} 如果labelname的值是 something ...

随机推荐

  1. Python的入门学习之 Day 7——from“夜曲编程”

    Day 7 time: 2021.8.4. 今天主要将"if-else"再扩展, 得到"if-elif-else"模型.它与"if-else" ...

  2. python 列表中随机抽取多个数

    方法一:[random.randint(0,100) for _ in range(2)]输出: [34, 44]方法二:list中随机去取K个数list=[1,2.3,......] random. ...

  3. prophet安装(ubuntu16 python3.6)

    ubuntu16 python3.6 (ubuntu16自带的python3是3.5 升级至3.6可参考https://blog.csdn.net/weixin_42544006/article/de ...

  4. 元素定位xpath路径中添加参数的方法

    在某次自动化测试中,需要定位下拉列表(非select列表)中不同的元素,我想到了利用参入参数的方式来实现,经过多次尝试,得到如下方法,与大家分享 例如在通过text定位某个元素时,self.find_ ...

  5. iOS设置textView的placeholder

    转载:http://blog.sina.com.cn/s/blog_7a1b23430102wkys.html #import "ViewController.h" @interf ...

  6. react实现转盘动画

    转盘动画方法如下: /** * 点击转动转盘 */ const turnCircle = () => { let runDeg = +(Math.random() * 360).toFixed( ...

  7. Element-ui框架Tree树形控件切换高亮显示选中效果

              废话不多说,直接上代码 1 <template> 2 <div class="warpper"> 3 <el-tree ref=& ...

  8. 三级菜单python编码及高级编码

    # -*- coding: utf-8 -*- # @Time : 2020/7/31 0:13 # @Author : Breeze # @FileName: 三级菜单.py menu = { '北 ...

  9. Vue父子组件传值——第一次传不过去之“怪象”?

    前言:最近写Vue父子组件传值出现第一次传不过去之"怪象",以为Vue的BUG呢.然则,是自己太菜"^_^"!!!特此记录以警己 <spec-param& ...

  10. node express框架搭建

    前面了解了一些node.js的服务建立及事件绑定和触发,要想一步一步自己来写所有响应,还是比较麻烦,看了express,很多东西都由框架自动完成,开发人员仅需关注自己想要实现的功能即可,真正实现了让开 ...