天天看点

面试之-mybatis中$和#的区别*

mybatis中$和#的区别

mybatis中KaTeX parse error: Expected 'EOF', got '#' at position 2: 和#̲的区别 今天面试遇到这个面试题…,但是具体的区别还真的不清楚,今天总结一下分享给大家。

#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替换。mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。

总结一

1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id =‘1’.

2 是 将 传 入 的 数 据 直 接 显 示 生 成 s q l 语 句 , e g : s e l e c t i d , n a m e , a g e f r o m s t u d e n t w h e r e i d = 是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id = 是将传入的数据直接显示生成sql语句,eg:selectid,name,agefromstudentwhereid={id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.

3 使用#可以很大程度上防止sql注入。(语句的拼接)

4 但是如果使用在order by 中就需要使用 $.

5 在大多数情况下还是经常使用#,但在不同情况下必须使用$.

一 : 理解mybatis中 $与#

在mybatis中的$与#都是在sql中动态的传入参数。

eg:select id,name,age from student where name=#{name}  这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。
           

二:使用$与#

#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。

${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

name–>cy

eg: select id,name,age from student where name=#{name} – name=‘cy’

select id,name,age from student where name=${name}    -- name=cy
           

原文

https://www.cnblogs.com/hellokitty1/p/6007801.html

总结二

今天在工作中有个点击排序的功能调试了许久,终寻因,总结之。

  需求是这样的,页面有个table,有一列的上下箭头可点击并排序。对于这种需求,我的mybatis.xml的sql配置写成了如下:

  ORDER BY columnName #{map.ColumnNameSort}

ColumnNameSort即前端传的排序方式,asc或者desc。

然后,预计它的输出应该是类似于下面这样的

ORDER BY columnName desc

但是,真正跑起来时,排序的效果一直没出现,经常一番查找,发现是mybatis 的’#{}’传值的问题,它将sql语句编译成了如下

ORDER BY columnName ‘desc’ 或者 ORDER BY columnName ‘asc’

这样,desc或者asc就成了字符串而不是关键字,sql语句的意思是columnName的别名是desc或者asc,没加排序关键字时默认是正序排序,成了如下

ORDER BY columnName “desc” asc 或者 ORDER BY columnName “asc” asc

排序没效果的问题找到原因了,解决之,mybatis提供了另一种绑定参数的方式–${param},将sql配置改为

ORDER BY columnName ${map.ColumnNameSort}

这样一来,mybatis会直接将ColumnNameSort的值加入sql中,不会转义。正确结果:

ORDER BY columnName desc

最后,对于mybatis中#和$绑定参数的区别做个总结,避免以后类似的问题发生。

#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。

${}将传入的数据直接显示生成在sql中。如:order by

${id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order

by id。

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

$方式无法防止Sql注入。

$方式一般用于传入数据库对象,例如传入表名.

一般能用#的就别用$.

ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

-原文:https://blog.csdn.net/u011519624/article/details/54674670/

个人总结

我觉得#与的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而{}穿入值,sql解析时,参数是不带引号的。

区别

#是将传入的值当做字符串的形式拼接到sql语句中,而KaTeX parse error: Expected 'EOF', got '#' at position 25: …显示生成sql语句。也可以认为#̲使用了一个占位符=‘?’,而是直接将数据拼接到sql语句中即=?。

注解:动态sql是mybatis的主要特性之一,在mspper中定义的参数传到xml中后,在查询之前mybatis会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 KaTeX parse error: Expected 'EOF', got '#' at position 16: {}。 在具体使用时,一般使用#̲{},当然在遇到一些必须是{}的情况时,就应该灵活应用,主要看那个可以达到效果,又可以防止注入攻击为准。

欢迎讨论勘正!

继续阅读