预编译语句(Prepared Statements)介绍,以MySQL为例
#和$的区别 Mybatis中参数传递可以通过#和$设置。它们的区别是什么呢? # Mybatis在解析SQL语句时,sql语句中的参数会被预编译为占位符问号? $ Mybatis在解析SQL语句时,SQL语句中的参数会被当做字符串拼接SQL。 使用#能够防止SQL注入攻击。 那么什么是预编译? 什么是预编译 通常,一条sql在db接收到最终执行完毕返回需要经历三个阶段: 词法和语义解析 优化sql语句,制定执行计划 执行并返回结果 但是如果同样一条SQL,如果只是参数值变了,不需要每次都语法语义解析、优化、制定执行计划, 所以可以将这类SQL语句中的值用占位符替代,不需要每次编译,可以直接执行 执行的时候,直接将每次请求的不同的值设置到占位符的位置。 可以视为将sql语句模板化或者说参数化。 如果觉得不好理解,可以看看 MySQL的预编译功能 预编译的优势 预编译可以缓存SQL,重复利用, 可以优化SQL的执行 预编译的缺点(什么场景不适合) 传入表名等数据库对象时,无法使用#,因为使用#占位符,会将表名加上引号,无法执行。 其他场景,能使用#占位符就尽量使用 参考: 预编译语句(Prepared Statements)介绍,以MySQL为例 # 与 $ 区别以及 sql 预编译 来源: https://www.cnblogs.com/wozixiaoyao/p/11580823