mysql 预处理理解,Mysql预处理与Mybatis

本文介绍了SQL的即时处理与预处理概念,强调预处理在提高效率和防止SQL注入方面的优势。预处理语句通过占位符替代具体值,实现一次编译多次执行。在Mysql中,使用prepare、execute、deallocate进行预处理操作。在Mybatis中,#{name}用于预处理,而${name}则进行字符串替换。预处理的使用能够提升性能并增强安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL的语句处理分为两类

1.即时SQL:

一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:

词法和语义解析;

优化 SQL 语句,制定执行计划;

执行并返回结果;

如上,一条 SQL 直接是走流程处理,一次编译,单次运行,

此类普通语句被称作 Immediate Statements

2.预处理SQL

但是,绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。

所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。

预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

使用预处理

prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句。PREPARE SQL1 FROM 'SELECT * FROM test WHERE TEST = ?';

SET @param = 123;

EXECUTE SQL1 USING @param;

Mybatis中的预处理

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下:

select*fromuserwherename="ruhua";

上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户。在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name:

select * from user where name= #{name};

或者

select * from user where name= ${name};

'#' 与 '$'的区别

#会执行预处理,例如sqlMap 中如下的 sql 语句

select * from user where name = #{name};

解析为:

selec t* from user where name= ?;

一个 #{ } 被解析为一个参数占位符?。

${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

例如,sqlMap 中如下的 sql

select * from user where name= ${name};

当我们传递的参数为 "ruhua" 时,上述 sql 的解析为:

select*fromuserwherename="ruhua";

预编译之前的 SQL 语句已经不包含变量 name 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值