一、数据库预编译
当我们说到关于持久层框架的功能,必然需要先想想这个功能的源头到底是不是直接通过数据库提供的。实际上和事务一样,SQL 预编译的功能也是需要数据库提供底层支持的。
1、预编译SQL的用法
以 MySQL 为例,在 MySQL 中,所谓预编译其实是指先提交带占位符的 SQL 模板,然后为其指定一个 key,MySQL 先将其编译好,然后用户再拿着 key 和占位符对应的参数让 MySQL 去执行,用法有点像 python 中的 format 函数。
一个标准的预编译 SQL 的用法如下:
先通过 prepare
设置一个 SQL 模板,然后通过 execute
提交参数,MySQL 会自行根据参数替换占位符,到最后执行的 SQL 就是:
select * from s_user where username = '%王五'
2、预编译的原理
这里有个有意思问题,按网上的说法,prepare
执行的时候实际上 SQL 已经编译完了,所以可以防止注入,因为后续不管塞什么参数都不可能在调整语法树了,换个角度想,这是不是说明,如果我们一开始就让 prepare
执行的 SQL 模板的关键字变成占位符,是不是应该在这个时候就编译不通过?
比如,可以把查询的表名改成占位符:
实际上也确实不行,因为