mybatis # $区别
admin
2023-07-31 03:20:10
0

1、#{} 会生成预编译SQL,会正确的处理数据的类型,而${}仅仅是文本替换。

对于SQL: select * from student where xCode = 'S123456';

如果使用#{}

那么生成的SQL为:

select * from student where xCode = ? 传的值为'S123456';

如果使用${}

那么生成的SQL为:select * from student where xCode = S123456

如果xCode的数据类型为varchar,那么使用${}就会报错。

2、${}一般用在order by, limit, group by等场所。

假设我们使用#{} 来指定order by字段,比如

select * from student order by #{xCode},

那么产生的SQL为

select * from student order by ?, 替换值后为

select * from student order by 'xCode'

Mybatis对xCode加了引号导致排序失败

3、为了性能考虑的,相同的预编译 sql 可以重复利用。其次,${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题。例如,如下的 sql:

select * from ${tableName} where name = #{name}  

假如,我们的参数 tableName 为 user; delete user; --,那么 SQL 动态解析阶段之后,预编译之前的 sql 将变为:

select * from user; delete user; -- where name = ?;  

-- 之后的语句将作为注释,不起作用,因此本来的一条查询语句偷偷的包含了一个删除表数据的 SQL。

4、表名作为变量时,必须使用 ${ }

这是因为,表名是字符串,使用 sql 占位符替换字符串时会带上单引号 '',这会导致 sql 语法错误,例如:

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

预编译之后的sql 变为:

select * from ? where name = ?;  

假设我们传入的参数为 tableName = "user" , name = "Jack",那么在占位符进行变量替换后,sql 语句变为:

select * from 'user' where name='Jack';  

上述 sql 语句是存在语法错误的,表名不能加单引号 ''(注意,反引号 ``是可以的)。

----------------------------------------华丽分割线------------------------------

sql预编译:

1. 定义:

sql 预编译指的是数据库驱动在发送 sql 语句和参数给 DBMS 之前对 sql 语句进行编译,这样 DBMS 执行 sql 时,就不需要重新编译。

2. 为什么需要预编译

JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以优化 sql 的执行。预编译之后的 sql 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的sql,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。预编译语句对象可以重复利用。把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个sql,可以直接使用这个缓存的 PreparedState 对象。mybatis 默认情况下,将对所有的 sql 进行预编译。


相关内容

热门资讯

台湾“毒油”对健康影响大!民众... 海峡导报综合报道 台湾中联油脂大豆沙拉油原料验出一级致癌物“苯骈芘”超标,风暴持续延烧。台湾民众党民...
“毒油事件”延烧赖清德却在表演... 海峡导报综合报道 台湾中联油脂大豆油致癌物超严重标案,赖清德昨天(7日)首度回应称“绝对会依法严格追...
俄称一夜击落400余架飞往莫斯... 7月7日,俄罗斯首都莫斯科市长索比亚宁通过社交媒体通报,从当地时间6日傍晚至7日清晨6时期间,飞向莫...
湖北一摊贩被卷进龙卷风受伤:医... “损失惨重,店里被吹得一片狼藉,什么都搞坏了,摆地摊的连人带车都被吹飞起来了。”7月7日上午,在黄冈...
64岁黑社会头目和女友被捕,“... 7月6日,香港警方有组织罪案及三合会调查科(俗称“O记”)召开案情通报会,公布代号“利针”的跨部门反...
强对流天气已致湖北11死1失联... 记者7日上午从湖北省相关部门获悉,7月6日晚,湖北东部多地遭遇强对流天气袭击,发生强降雨和雷暴大风,...
广西横州强降雨已致4人死亡8人... 7月7日上午,广西南宁市召开第二场防汛救灾新闻发布会,通报横州市、宾阳县防汛救灾进展情况并回答记者提...
韩红基金会向广西捐赠200万元 受台风“美莎克”影响,广西遭遇历史性特大洪水,南宁横州市六蓝水库发生约50米宽溃坝险情,目前已造成2...
效仿特朗普!英国也致信国际足联... 据路透社7月7日报道,英国政界将美国前锋弗洛兰·巴洛贡的处罚争议和英格兰队的世界杯征程绑定,敦促国际...
甘肃山体滑坡33人被埋,已救出... 7月7日6时56分许,陇南市宕昌县南河镇任藏村发生山体滑坡,造成33人被掩埋。截至目前,已成功救出1...