在动态sql解析过程,#{}与${}的效果是不一样的:
-
#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下sql语句
select * from user where name = #{name};
会被解析为:
select * from user where name = ?;
可以看到#{}被解析为一个参数占位符?。 -
${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
如以下sql语句:
select * from user where name = ${name};
当我们传递参数“sprite”时,sql会解析为:
select * from user where name = “sprite”;
可以看到预编译之前的sql语句已经不包含变量name了。
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。 -
#{}与${}的区别可以简单总结如下:
#{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
KaTeX parse error: Expected 'EOF', got '#' at position 29: …成在sql中,不会添加引号 #̲{}能够很大程度上防止sql注…{}无法防止sql注入
建表语句:
CREATE TABLE ${tableName} (
TASK_ID varchar(50) NOT NULL COMMENT ‘唯一ID’,
ASSIGN_MAN varchar(50) DEFAULT NULL COMMENT ‘任务制定人’,
LEAD_MAN varchar(50) DEFAULT NULL COMMENT '牵头单位 默认为任务指定人, ',
EXECUTE_MEN varchar(50) DEFAULT NULL COMMENT ‘数组形式存储,调度开始后,根据每个参与单位在任务填报表中生成一条记录;当导入时,该字段需要用户自行配置,不支持导入。’,
CONFIG_STATUS tinyint NOT NULL COMMENT ‘审核状态 0: 未审核;1:审核通过;2:退回;3: 调整中。’,
TEMPLATE_ID varchar(50) NOT NULL COMMENT ‘模版ID 用于报表生成’,
HEAD_NAME1 varchar(50) NOT NULL COMMENT ‘牵头单位配置。字段为表头ID,对应于REPORT_LINE 的ID,以在生成报表的时候生成各种样式。’,
HEAD_NAME2 varchar(50) NOT NULL COMMENT ‘需要考虑数据库表头字符长度限制’,
HEAD_NAME3 varchar(50) NOT NULL COMMENT ‘需要考虑数据库表头字符长度限制’,
MODIFY_TIME datetime NOT NULL COMMENT ‘修改时间’,
CREATE_TIME datetime NOT NULL COMMENT ‘创建时间’,
PRIMARY KEY (TASK_ID)
)comment = '任务配置表 ’ ENGINE=InnoDB DEFAULT CHARSET=utf8
动态SQL解析与安全

被折叠的 条评论
为什么被折叠?



