写点什么

Mybatis 中#{}和 ${}的区别

  • 2022 年 8 月 04 日
  • 本文字数:1056 字

    阅读完需:约 3 分钟

Mybatis 中 #{}和 ${}的区别

首先说一下 SQL 注入

SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的 SQL 语句被插入到执行的实体字段中,攻击者在界面的表单信息或 URL 上输入一些奇怪的 SQL 片段(例如“or ‘1’=‘1’”这样的语句),有可能入侵参数检验不足的应用程序。

所以两种方式的区别就体现出来了:

1.#{变量名}可以进行预编译、类型匹配等操作,#{变量名}会转化为 jdbc 的类型。#方式能够很大程度防止 sql 注入;

2.$ {变量名}不进行数据类型匹配,直接替换。 方式无法方式 sql 注入。$ 方式一般用于传入数据库对象,例如传入表名;

3.#会自动加双引号,$不会加双引号。

这两个符号在 mybatis 中最直接的区别就是:#相当于对数据加上单引号,$相当于直接显示数据(只讨论字符串类型的)。

举个栗子:

#对传入的参数视为字符串,也就是它会预编译,select * from user where name = #{name},比如我传一个 xiaowei,那么传过来就是 select * from user where name = 'xiaowei';

$ 将不会将传入的值进行预编译,select * from user where name=${name},比如我传一个 xiaowei,那么传过来就是 select * from user where name = xiaowei;

#的优势就在于它能很大程度的防止 sql 注入,而 $ 则不行。比如:用户进行一个登录操作,后台 sql 验证式样的:select * from user where username=#{name} and password = #{pwd},如果前台传来的用户名是“xiaoweihaoshuai”,密码是 “1 or 1=1”,用 #的方式就不会出现 sql 注入,而如果换成 $方式,sql 语句就变成了 select * from user where username=wang and password = 1 or 1=1。这样的话就形成了 sql 注入。

🍷Mysql 的四大特性

Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部做完,要么全部不做,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行(Serializable)。

Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。


用户头像

还未添加个人签名 2022.05.23 加入

区块链项目开发,咨询weixin:hkkf5566

评论

发布
暂无评论
Mybatis中#{}和${}的区别_开发微hkkf5566_InfoQ写作社区