JDBC中的Statement和PreparedStatementjs中 和 的区别别

7093人阅读
java(36)
mysql(3)
1:创建时的区别:
&&& Statement statement = conn.createStatement();
&&& PreparedStatement preStatement = conn.prepareStatement(sql);
&&& 执行的时候:
&&& ResultSet rSet = statement.executeQuery(sql);
&&& ResultSet pSet = preStatement.executeQuery();
由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,
而 statement 不同,如果执行多变,则相应的就要编译多少遍sql,所以从这点看,preStatement 的效率会比 Statement要高一些
import java.sql.C
import java.sql.DriverM
import java.sql.PreparedS
import java.sql.ResultS
import java.sql.S
public class JDBCTest {
&& &public static void main(String[] args) throws Exception {
&& &&& &//1 加载数据库驱动
&& &&& &Class.forName(&com.mysql.jdbc.Driver&);
&& &&& &//2 获取数据库连接
&& &&& &String url = &jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&;
&& &&& &String user = &root&;
&& &&& &String password = &root&;
&& &&& &Connection conn = DriverManager.getConnection(url, user, password);
&& &&& &//3 创建一个Statement
&& &&& &String sql = &select id,loginName,email from user where id=&;
&& &&& &String tempS
&& &&& &int count = 1000;
&& &&& &long time = System.currentTimeMillis();
&& &&& &for(int i=0 ;i&i++){
&& &&& &&& &Statement statement = conn.createStatement();
&& &&& &&& &tempSql=sql+(int) (Math.random() * 100);
&& &&& &&& &ResultSet rSet = statement.executeQuery(tempSql);
&& &&& &&& &statement.close();
&& &&& &System.out.println(&statement cost:& + (System.currentTimeMillis() - time)); &
&& &&& &String psql = &select id,loginName,email from user where id=?&;
&& &&& &time = System.currentTimeMillis(); &
&& &&& &for (int i = 0; i & i++) { &
&& &&& &&&& int id=(int) (Math.random() * 100); &
&& &&& &&&& PreparedStatement preStatement = conn.prepareStatement(psql);
&& &&& &&&& preStatement.setLong(1, new Long(id)); &
&& &&& &&&& ResultSet pSet = preStatement.executeQuery();
&& &&& &&&& preStatement.close(); &
&& &&& &} &
&& &&& &System.out.println(&preStatement cost:& + (System.currentTimeMillis() - time)); &
&& &&& &conn.close();
上述代码反复执行,
statement cost:95&&&&&&&&&& preStatement cost:90
statement cost:100&&&&&&&& preStatement cost:89
statement cost:92&&&&&&&&&& preStatement cost:86
当然,这个也会跟数据库的支持有关系,/blog/49292& 这篇帖子有说明
虽然没有更详细的测试 各种数据库, 但是就数据库发展 版本越高,数据库对 preStatement的支持会越来越好,
所以总体而言, 验证& preStatement 的效率 比 Statement 的效率高
2&安全性问题
这个就不多说了,preStatement是预编译的,所以可以有效的防止 SQL注入等问题
所以 preStatement 的安全性 比 Statement 高
3&代码的可读性 和 可维护性
这点也不用多说了,你看老代码的时候& 会深有体会
preStatement更胜一筹
别的暂时还没有想到,说没有查到会更好一些(汗),如果有别的差异,以后再补充
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:290170次
积分:1507
积分:1507
排名:千里之外
原创:31篇
转载:30篇
评论:13条
(2)(2)(3)(2)(3)(1)(1)(11)(13)(2)(2)(1)(3)(3)(1)(4)(2)(2)(1)(1)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix' 共同点:
PreparedStatement和Statement都是用来执行SQL查询语句的API之一。
在PreparedStatement中,当我们经常需要反复执行一条结构相似的sql语句,比如:
insert into table values(0,'first',1);
insert into table values(0,'second',2);
我们可以使用带占位符的sql来代替它:
insert into table values(0,?,?);
然后每次传入参数即可,但是Statement中是不允许使用占位符的,更没有带参数。而且更重要的是PreparedStatement会预编译sql语句,把预编译后的sql语句存在对象中,那么这样每次传入参数执行查询等操作会变得非常高效,也就是说PreparedStatement比Statement高效。PreparedStatement还提供了一系列的setXxx(int index, Xxx value)方法来传入参数。
PreparedStatement可以防止SQL注入式攻击:
(以下内容部分参考维基百科:http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A)
比如:某个网站的登录验证SQL查询代码为:
strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';"
恶意填入:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么最终SQL语句变成了:
strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';"
因为WHERE条件恒为真,这就相当于执行:
strSQL = "SELECT * FROM"
因此可以达到无账号密码亦可登录网站。
都已经登陆数据库了,后面想干啥还能让你控制么?
然而使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入。在使用参数化查询的情况下,数据库不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行。
本博客内容与代码均为作者Jarvis原创,如若转载请注明。
阅读(...) 评论()本帖子已过去太久远了,不再提供回复功能。&& &文章主题:
交流经验:
总积分:261656
级别:VIP5
文章: 1163
PreparedStatement
注入问题,而
是动态拼出
PreparedStatement
进行预编译,因此如果我们采用绑定变量的
类似,数据不同)数据库只需解析一次(生成执行计划),因此效率要高;
由于没有采用绑定变量,因此可能每次都需要编译(生成执行计划),因
此对于那种语句类似但数据不同的
每次都需要编译,效率低;
PreparedStatement
只执行一次,应该使用
、在大多数情况下都应该使用
PreparedStatement
&& &文章主题:
交流经验:
总积分:1037
级别:普通会员
个性签名:从have到how到why的过程
&& &文章主题:
交流经验:
总积分:9672
级别:VIP2
区别写的很详细,对以后面试和笔试都很有帮助!
个性签名:生活,就是生下来,活下去!
选择一个版面
软件设计专版
Web前端技术
学习问题讨论
面试、就业
版权所有 Copyright(C) 私塾在线学习网简单来说,prepareStatement 提供预编译SQL语句,可以用&?& 来替换需要改变的参数值,类似于正则化 SQL查询语句。
createStatement则不提供预编译SQL,需要实时executeQuery(sqlStr) 来访问数据库。 因此,prepareStatement可以多次使用,提高访问数据库的效率。
具体可以参考:http://blog.csdn.net/jiangwei/article/details/&
Code Fragment 1:
Code Fragment 2:
然而,prepareStatement 也有局限性,并不能修改类似表名。
SQL查询语句为“SELECT * FROM &‘TableName’ WHERE COF_NAME LIKE ‘Colombian’& ”
本文已收录于以下专栏:
相关文章推荐
本人的几点浅见,各位大大不喜勿喷。
说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别,相信大家在网上...
prepareStatement与Statement的区别
stmt=conn.CreateStatement();
resultSet rs=stmt.execut...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
以Oracle为例吧
Statement为一条Sql语句生成执行计划,
如果要执行两条sql语句
select colume from table where colume=1;
这篇文章并没有给出如何使用ResultSet的具体例子,只是从ResultSet的功能性上进行了详细的讲述。希望这篇文章对大家理解ResultSet能够有所帮助。下面就是这篇文章的具体内容。
ConnectionPool类:
package com.vl.
import java.sql.C
import java.sql.DatabaseMe...
一、prepareStatement 的用法和解释
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数...
大家都知道,java中JDBC中,有个预处理功能,这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。
      ...
一、使用Statement而不是PreparedStatement对象
JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它...
1.       声明(Declarations)5.1  每行声明变量的数量(Number Per Line)推荐一行一个声明,因为这样以利于写注释。亦即, // indent...
      mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下:
他的最新文章
讲师:董西成
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 js中 和 的区别 的文章

 

随机推荐