永发信息网

mybatis中的$和#的区别

答案:3  悬赏:50  手机版
解决时间 2021-02-06 17:47
mybatis中的$和#的区别
最佳答案
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

3. #方式能够很大程度防止sql注入。 

4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.

6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis本身的说明:

?

1
2
3
4
5

String Substitution
By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.
NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.

从上文可以看出:

1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

?

1
2

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

这样做的好处是:更安全,更迅速,通常也是首选做法。

2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

?

1

ORDER BY ${columnName}

此时MyBatis 不会修改或转义字符串。

这种方式类似于:
?

1
2

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);

这种方式的缺点是:
以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。
全部回答
$是拼接sql,#是传参
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是Bee框架不会有这个问题.可以尝试下,多一个选择. Bee框架:一个十分钟即可学会的ORM框架。它不用每操作一个数据库表,就要编写一次dao代码,省时/优雅、简易、自动( Tea: Timesaving/Tasteful, Easy, Automatic) ,开发效率极高,编码复杂度为O(1). 一个开发成本和开发速度都不比php差的java ORM框架。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如何让眼睛变色。不带美瞳。
凤阳县百货大楼怎么去啊,我要去那办事
【吕梁英雄传全集下载】吕梁英雄传英语怎么说
心理学家洛伦茨的印刻研究
北京童年儿童摄影会馆我想知道这个在什么地方
1岁小孩被吓到晚上哭闹怎么办?
半山校区的浙江工贸职业技术学院寝室有没有热
小陆日杂百货地址在哪,我要去那里办事
My watch doesn't work.Why not have it
奔富酒园BIN 707和R989哪个好?
新房子是先贴瓷砖还是先装水管儿
夏普吐勒克地址在什么地方,想过去办事
吸雕双眼皮大家觉得怎么样呀?
明亮百货地址在哪,我要去那里办事
下列生物中,没有细胞结构的是AA. T噬菌体B.
推荐资讯
资产评估升值,什么时候调整资产的账面价值,
 20 发现护士私自买卖医院药物 如何和医院
学校、社会福利机构属于()
关山羊奶粉怎么样
欧风·时尚怎么去啊,有知道地址的么
我现在城镇集体户口,在上海工作,如果我户口迁
大化野马灯饰店地址有知道的么?有点事想过去
【蓄谋已久的意思】蓄谋已久中的久是什么意思
雅悦ktv地址在哪,我要去那里办事
我想请问下,2018年临海事业单位招聘考试一年
中华联合财产保险股份有限公司攸县支公司这个
燕寨村地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?