`
flatcsun
  • 浏览: 7388 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

PreparedStatement学习笔记

 
阅读更多

关于PreparedStatement的优点,在网上主要看到3个优点:

 

 1.代码的可读性和可维护性。

 

 2.尽最大可能提高性能。

     PreparedStatement是预编译的,对会被多次执行的相同SQL,只预先对SQL进行编译,每次执行SQL就不用编译SQL了,直接执行预先编译得到的执行计划。PreparedStatement提高效率的关键在于减少了Statement每次执行SQL时都要编译SQL的时间。

     PreparedStatement是怎么实现预编译的,PreparedStatement预存的SQL上的"?"和对应的值是怎么传给数据库执行的?如果是先合并在一起传给数据库,那和Statement就没有两样了;如果是分成2个参数传给数据库,那么数据库是怎么处理"?"和对应的值?查询数据库原理的课本后,我觉得SQL编译后得到的执行计划会把where条件里的字段、操作符、字段对应值(假设为a)拆分开,然后在匹配数据库数据时,遍历表的数据行时取出字段对应值(假设为b),再判断"b操作符a"得到满足条件的行。执行计划应该至少两种方式,一种是直接编译SQL得到字段、操作符、字段对应值,适用于Statement;另一种是编译SQL得到字段、操作符,但是没有字段对应值,这时需要外部调用程序把字段对应值按"?"顺序传进来,适用于PreparedStatement。我猜想是这样的,等以后对数据库了解更深入时再验证一下。

 

 3.极大地提高了安全性。

 

其他文章看到的主要观点
1.JDBC的性能最大的增进是减少JDBC驱动与数据库之间的网络通讯.
2.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
3.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
4.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译的, preparedstatement支持批处理
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。

 


http://choelea.iteye.com/blog/538433看到的PreparedStatement三大优点
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

二.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.

三.最重要的一点是极大地提高了安全性.

即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?

select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.
 

 


分享到:
评论

相关推荐

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    良葛格JAVA 学习笔记

    《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...

    J2EE框架学习笔记

    本篇学习笔记将聚焦于四个核心的J2EE框架:JDBC、Hibernate、Struts和Spring,这些框架在现代企业应用开发中扮演着重要角色。 **JDBC(Java Database Connectivity)**是Java语言访问数据库的标准API,它是连接Java...

    JDBC 学习笔记 JDBC 学习笔记

    **JDBC学习笔记** 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的关键技术。它是Java API,允许Java程序与各种类型的数据库进行交互。本笔记将深入探讨JDBC的核心概念、工作原理以及实际应用。 ...

    jdbc学习笔记完美版

    JDBC的学习笔记涵盖了从基本概念到实际操作的各个方面,对于初学者来说是一份很好的参考资料。通过学习JDBC,开发者能够有效地在Java应用程序中集成数据库功能,实现数据的增删改查以及与存储过程的交互。理解和掌握...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    丛书名: 学习笔记 出版社:清华大学出版社 ISBN:9787302282082 上架时间:2012-5-9 出版日期:2012 年5月 开本:16开 页码:564 版次:1-1 所属分类:计算机 > 软件与程序设计 > JAVA(J#) > Java 编辑推荐   ...

    Java JDK 6学习笔记_pdf版(附课本代码)

    这份“Java JDK 6学习笔记”涵盖了从基础到高级的各种主题,是Java初学者和进阶者的重要参考资料。以下是笔记中可能包含的一些关键知识点: 1. **安装与配置**:介绍如何在不同操作系统(如Windows、Linux和Mac OS...

    JDBC学习笔记

    ### JDBC学习笔记知识点详解 #### 一、JDBC理论概述 **JDBC**(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供...

    Java数据库学习笔记

    Java数据库学习笔记主要聚焦在Java如何与数据库进行交互,尤其是通过Java Database Connectivity(JDBC)API。JDBC是Java平台中的一个标准接口,它允许Java应用程序连接到各种类型的数据库,无论是关系型数据库还是...

    良葛格java学习笔记

    【标题】:“良葛格java学习笔记”是一个关于Java编程语言的学习资料集合,由作者林信良编写,旨在分享他的学习心得和实践经验。这个资源特别关注JDK 6.0的新特性和功能,帮助读者更好地理解和掌握这一版本的Java...

    学习笔记.zip

    在"学习笔记.zip"中,我们主要关注的是"JavaWeb笔记.md"这个文件,它很可能包含了关于JavaWeb开发的学习记录。JavaWeb是Java技术在Web应用程序开发中的应用,涵盖了许多关键概念和技术,如Servlet、JSP、过滤器、...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    JSP学习笔记(三)-----使用JSP处理用户注册和登陆

    ### JSP学习笔记(三)——使用JSP处理用户注册和登录 #### 一、概述 本篇笔记介绍了一个简单的用户注册与登录系统的实现过程,该系统由四个JSP页面构成,分别是`login.jsp`、`test.jsp`、`test2.jsp`以及未给出具体...

    入门必备Java学习笔记

    "入门必备Java学习笔记"这个资源,正如其名,旨在帮助初学者掌握Java编程的基础,并逐步深入理解其核心概念。这本书涵盖了Java Standard Edition (Java SE) 的API,Javalang的基本元素,以及数据库连接技术JDBC和...

    JDBC笔记_JDBC学习笔记_

    在本篇JDBC学习笔记中,我们将深入探讨JDBC的基础知识、核心概念以及实际应用。 一、JDBC基础 1. JDBC驱动程序:JDBC驱动是连接Java应用程序和数据库之间的桥梁。根据实现方式,JDBC驱动分为四种类型:类型1(JDBC...

    JDBC个人学习笔记

    【JDBC学习笔记】 JDBC,全称Java Database Connectivity,是Java编程语言中用来规范客户端程序如何访问数据库的应用程序接口,由Sun Microsystems公司提出。它为程序员提供了标准的API,使得开发者可以使用Java...

    传智播客视频Jdbc学习笔记

    ### 传智播客JDBC学习笔记精要 #### JDBC简述与连接 JDBC(Java Database Connectivity)是Java中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。在传智播客的JDBC...

    配套学习资料:Java开发 - 尚硅谷JDBC学习笔记

    Java开发 - 尚硅谷JDBC学习笔记是一套深入解析Java数据库连接(JDBC)技术的教程,涵盖了从基础到进阶的各种知识点。JDBC是Java编程语言中用于访问数据库的标准应用编程接口,它允许程序员使用Java来执行SQL语句,...

    JDBC学习笔记(精华版)-1

    本篇JDBC学习笔记将深入探讨JDBC的核心概念、操作步骤以及最佳实践。 **一、JDBC基本概念** 1. **驱动程序**:JDBC驱动程序是Java应用程序与数据库之间的桥梁,分为四种类型:JDBC-ODBC桥接驱动、本地API驱动、...

Global site tag (gtag.js) - Google Analytics