java $和$$的区别_Java #{}和${}区别

Mybatis中使用#{}可以防止sql注入

#{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.

: 表 示 拼 接 S Q L 串 , 通 过 {}: 表示拼接SQL串,通过:表示拼接SQL串,通过{}可将parameterType内容拼接在SQL中而不进行JDBC类型转换,可 以 接 收 简 单 类 型 或 P O 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 的 是 单 个 简 单 类 型 值 , {}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,{}花括号中只能是value.

虽然不 能 防 止 S Q L 注 入 , 但 有 时 {}不能防止SQL注入,但有时不能防止SQL注入,但有时{}会非常方便(如order by排序,需要将列名通过参数传入SQL,则用ORDER BY ${column},使用#{}则无法实现此功能.

防止sql注入的原理:

先看下面用占位符来查询的一句话

String sql = “select * from administrator where adminname=?”;

psm = con.prepareStatement(sql);

String s_name =“zhangsan’ or ‘1’='1”;

psm.setString(1, s_name);

假设数据库表中并没有zhangsan这个用户名,

用plsql运行sql语句,可以查出来所有的用户名,但是在Java中并没有查出任何数据,这是为什么呢?

首先,setString()的源码中只有方法名字,并没有任何过程性处理,

那么答案肯定出现在Java到数据库这个过程中,也就是mysql和oracle驱动包中,在mysql驱动包中,PreparedStatement继承并实现了jdk中的setString方法,

也就是原因在于数据库厂商帮你解决了这个问题,下面就看看这个方法的具体实现:

cd123b553c1b49e762ed0f8e874f7253.png

627a8d263c815478211c6c561a4f1830.pngd8db86e852dc003edc729d2a552d5a80.png

ab68f306c3e2fcb18b9e354cc26cd9d3.png

可以看出数据驱动代码中对传入的参数首尾加了引号,并且对参数中的引号进行了转义,所以在数据库中真正执行的是把参数作为一个字符串格式来处理,如果是整数类型字段会自动cast类型。

spring #{} 可以使用SpEL表达式,${}可以获取应用配置文件中的配置值

1 @Value("#{}") SpEL表达式

@Value("#{}") 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量

@RestController

@RequestMapping("/login")

@Component

public class LoginController {

@Value("#{1}")

private int number; //获取数字 1

@Value("#{'Spring Expression Language'}") //获取字符串常量

private String str;

@Value("#{dataSource.url}") //获取bean的属性

private String jdbcUrl;

@Autowired

private DataSourceTransactionManager transactionManager;

@RequestMapping("login")

public String login(String name,String password) throws FileNotFoundException{

System.out.println(number);

System.out.println(str);

System.out.println(jdbcUrl);

return "login";

}

}

[email protected](#{""}) 获取其他bean的属性,或者调用其他bean的方法时,只要该bean (Beab_A)能够访问到被调用的bean(Beab_B),即要么Beab_A 和Beab_B在同一个容器中,或者Beab_B所在容器是Beab_A所在容器的父容器。(拿我上面贴出来的代码为例在springMvc项目中,dataSource这个bean一般是在springContext.xml文件中申明的,而loginController这个bean一般是在springMvc.xml文件中申明的,虽然这两个bean loginController和dataSource不在一个容器,但是loginController所在容器继承了dataSource所在的容器,[email protected]("#{dataSource.url}")能够获取到dataSource的url属性)。

2 @Value("${}")

[email protected]("${}") 可以获取对应属性文件中定义的属性值。假如我有一个sys.properties文件 里面规定了一组值: web.view.prefix =/WEB-INF/views/

在springMvc.xml文件中引入下面的代码既即以在 [email protected]("w e b . v i e w . p r e f i x " ) 获 取 这 个 字 符 串 。 需 要 指 出 的 是 , 如 果 只 在 s p r i n g M v c . x m l 引 入 下 面 代 码 , 只 能 在 s p r i n g M v c . x m l 文 件 中 扫 描 或 者 注 册 的 b e a n 中 才 能 通 过 @ V a l u e ( " {web.view.prefix}")获取这个字符串。需要指出的是,如果只在springMvc.xml引入下面代码,只能在springMvc.xml文件中扫描或者注册的bean中才能[email protected]("web.view.prefix")获取这个字符串。需要指出的是,如果只在springMvc.xml引入下面代码,只能在springMvc.xml文件中扫描或者注册的bean中才能通过@Value("{web.view.prefix}")获取这个字符串,其他未在springMvc.xml扫描和定义的bean必须在相应的[email protected]("${}”)表达式

然后再controller文件中通过下面代码即可获取“”/WEB-INF/views/“”这个字符串

@Value("${web.view.prefix}")

private String prefix;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

half-sync/half-async 和 Leader/Followers 模式的主要区别

在 《POSA2》 一书中,关于这两个模式有两个很形象的比喻:半同步/半异步(half-sync/half-async):许多餐厅使用 半同步/半异步 模式的变体。例如,餐厅常常雇佣一个领班负责迎接顾客,并在餐厅繁忙时…

JAVA中的IO系统详解

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部…

Windows 8 JavaScript Metro应用程序--入门(上)

Windows 8 JavaScript Metro应用程序--入门(上) 如你所知的Windows8允许你通过以下几种方式创建Metro应用程序: CC# JavaScript第一部分将侧重于主体结构和JavaScript Grid 应用程序的基础,在随后的文章中我将深度探究在Windows8中…

如何构建自己的SIP SERVER!

如果你下载了 sip phone, 自己又做了一个 SIP SERVER,那么你就可以当老大了,不要什么MSN,QQ的语音通话了,自己就可以直接同你想要的人通话了。1:软件准备:A: SIP SERVER http://www.brekeke.com/en/download/idx_sipse…

mac java版本 不一致_mac实现不同版本的jdk切换

之前使用jdk11进行java开发(纯粹因为喜欢新版?)但是使用jdk11在布署hadoop伪分布时各种报错, 所以还是下载jdk8回来.接下来就是mac端切换两个版本的jdk(按照网上找的方式好像有bug-文章最后再说.虽然不知道怎么解决,但是至少我可以成功部署hadoop, 所以这里就先忽略)首先下载j…

Meld安装

Ubuntu下文件/目录对比的软件Meld可能有很多用户还不是很熟悉,下文就给大家介绍如何安装Meld和移植到Gedit下。具体内容如下所述。 Meld允许用户查看文件、目录间的变化。很容易移植到Gedit下,方便用户使用。 安装Meld Meld默认在Ubuntu官方源中&#…

[译]预留位置队列PRQueue:多线程程序中消息输入队列和消息输出队列保持同序...

译自: http://accu.org/var/uploads/journals/overload101.pdf 在多线程应用程序中,要求消息输入队列和消息输出队列顺序要求保持一致,而忽略多线程并发处理的顺序,这种情况是比较难处理的。在本文中,作者设计了一种新…

java 前端工作内容_java前端、java后端、java全栈工作主要内容是什么?哪个薪资高?...

摘要最近,听了一场关于java全栈工程师职位的简介说明,里面很清楚的说明了一下前端,后端,全栈都是做什么工作的。其实,想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效。我知道一些…

OpenGL ES 2.0 for iPhone Tutorial

来源:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial If youre new here, you may want to subscribe to my RSS feed or follow me on Twitter. Thanks for visiting! Learn how to use OpenGL ES 2.0 from the ground up! OpenGL ES is th…

java种子填充_种子填充实例运行出问题

种子填充实例运行出问题import java.awt.*;import java.applet.*;import java.awt.image.ImageProducer;import java.awt.image.MemoryImageSource;import java.util.Stack;public class scanseed extends Applet {private static final long serialVersionUID 1L;int redColo…

java幂等性原理_Java接口幂等性设计原理解析

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景:一个订单创建接口,第一次调用超时了,然后调用方重试了一次在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次…

java web Jersey_使用CXF和Jersey框架来进行Java的WebService编程

CXFCXF是在xfire的基础上实现的。1)首先呢,还是包的问题,在http://cxf.apache.org/download.html这里可以下到最新版的CXF,当然,我用的是最新版的。接下来还是那句废话,建WEB项目,放入JAR包。而JAR包我们就…

S3C2440与SDRAM的地址连线分析

S3C2440有27根地址线ADDR[26:0],8根片选信号ngcs0-ngcs7,对应bank0-bank7,当访问bankx的地址空间,ngcsx引脚为低电平,选中外设。 2^272^7 * 2^10 * 2^10 128Mbyte 8*128Mbyte 1Gbyte 所以S3C2440总的寻址空间是1Gbyte。 市面…

java方法有excel实现_Java实现EXCEL操作(1)

Java实现EXCEL操作(1)1、实现方法:现在有三种方法去实现:jxl 、poi 、 FastExcel:97~2003在这里只讲poi实现方法。poi的包可以去Apache官网上去下载:http://poi.apache.org/download.html2、poi实现【1】低版本的导入导出方法&…

maven生成javadoc【原创】

1.命令模式: mvn javadoc:javadoc 2.eclipse下: 转载于:https://www.cnblogs.com/caiyuanzai/archive/2012/03/30/2425780.html

S3C2440_MMU

MMU,全称Memory Manage Unit, 中文名——存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以 …

某单位会java_Java核心API -- 4(日期类)

1. Date类(Java.utilDate)java.util.Date类用于封装日期及时间信息,一般仅用它显示某个日期,不对他作任何操作处理,作处理用Calendar类,计算方便。//创建一个Date实例,默认的构造方法创建的日期代表当前系统时间Date d…

java阴阳师抽卡概率_《阴阳师》公布抽卡概率!看到数字我哭了

随着《文化部关于规范网络游戏运营加强事中事后监管工作的通知》(以下简称“通知”)的正式生效,网游与手游似乎也迎来了一个全新的时代,除了我们之前关注的游戏帐号实名制认证之外,道具的合成以及氪金抽卡概率问题也非常值得玩家注意&#xf…

JAVA中返回值为字母时_LeetCode#524通过删除字母匹配到字典里最长单词-java中CompareTo方法用法以及Comparator中Compare方法返回值...

import java.util.Collections;import java.util.Comparator;import java.util.List;/*524. 通过删除字母匹配到字典里最长单词给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止…

关于JS中的constructor与prototype

在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西。一般人们叫它函数。比如下面的代码&…