java中statement、prepareStatement的相关理解

statement使用方法

Statement statement = connection.createStatement();
String queryString = "select username,password from user_table where username=‘" +
      username + "‘ and password=‘" + password + "‘";
ResultSet resultSet = statement.executeQuery(queryString);

statement 为非预编译语句,每次执行会去数据库 生成一条语句执行。

如果 password 变量 赋值为 ‘ or ‘‘1‘=‘1’ 则 整个语句为

select username,password from user_table where username=‘zhagnsan‘ and password=‘‘ or ‘1‘=‘1‘

statement会把这个字符串传给数据库进行执行,此字符串带有注入,所以输入任何信息都会 登陆成功。

prepareStatement 使用方法

 String queryString = "select username,password from user_table where username = ? "
                + "and password = ?";
 preparedStatement = connection.prepareStatement(queryString);
 preparedStatement.setString(1, username);
 preparedStatement.setString(2, password);
 resultSet = preparedStatement.executeQuery();
connection.prepareStatement(queryString); 会把语句传给数据库 生成预编译语句。

然后username ,password 的值就会变成 两个问号的参数。输入 or ‘‘1‘=‘1‘的值只会当成第二个参数值,数据库里预编译的语句 不会把 or 当成 选择关系关键字,只会当成一个参数字符串,传进预编译的语句,这样预编译语句 可以防止注入。

并且预编译语句 不用每次执行都去生成一条执行语句,而是生成一次之后可以多次调用使用,而statement是每次都会将拼接的 String字符串 去数据库生成语句执行。

预编译prepareStatement是statement更有效率。

时间: 2024-10-10 16:00:22

java中statement、prepareStatement的相关理解的相关文章

JAVA 中BIO,NIO,AIO的理解

JAVA 中BIO,NIO,AIO的理解 博客分类: 网络编程 [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

在Java中,显示操作系统相关信息

信 念 人可以被打败,但不可以被打倒.心中有光,任何外来不利因素都扑灭对人生的追求和对未来的向往.很多时候,击败我们的不是别人而是我们对自己失去信心,熄灭了心中那片有如火山一般沉寂的光.只要心中有光,在第一百次被打倒后,就会第一百零一次站起来,并用不屈的毅力和信念赢得未来. 最近编码的时候,由于经常在windows和Mac OS 之间切换,有些代码不能很好的兼容,在整理代码的时候,顺便把使用Java显示常用操作系统信息的方法整理了一下: public class SystemInfo { /**

java中的回调机制的理解(小例子)

这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到.在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数. 正常情况下开发人员使用已经定义好的API,这个过程叫Call.但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让

关于Java中形参与实参的理解

今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递的区别).参考网站http://www.cnblogs.com/binyue/p/3862276.html.下面我将通过次博文记录自己的理解,还望能够帮助再学Java或者复习Java的朋友们. 一.基本类型与引用类型在内存中的保存内容 Java中的变量分为基本类型和引用类型两种.基本类型的变量保存数值本身,而引用类型的变量保存的是引用值,即指向内存空间的地址. 基本类型包括:byte,char,int

java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!!

大家都知道,java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入. 用法就是如下边所示: String sql="update cz_zj_directpayment dp"+ "set dp.projectid = ? where dp.payid= ?"; try { PreparedStatement pset_f = conn.prepare

java中string内存的相关知识点

(一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用. 2.堆:存放用new产生的数据,其中清理垃圾采用垃圾回收机制. 在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了

Java中多态的一些简单理解

什么是多态 1.面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2.多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 3.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 4.多态的作用:消除类型之间的耦合关系. 5.现实中,关于多态的例子不

java中关于null的一些理解

1.null是Java中的关键字,像public.static.final.它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错. 2.null是任何引用类型的默认值,不严格的说是所有object类型的默认值.这对所有变量都是适用的,如成员变量.局部变量.实例变量.静态变量 3.null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型 4.null可以赋值给引用变量,你不能将null赋给基本类型变量,例如

个人对Java中多态的一些简单理解

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例子不胜枚举. 下面是多态