`
jingle1267
  • 浏览: 12721 次
文章分类
社区版块
存档分类
最新评论

关于jdbc(转)

 
阅读更多
http://www.douban.com/group/topic/9287727

没怎么用Jcreator Drivers的路进因该要设置,看看在classpath上加上driver路径
用eclipse吧
JDBC详解 收藏

在以java application server应用为主的平台是,JDBC的最高级应用是DataSource的实现,其它的,JDO,webcache,hibernate等

不过是一种封装,所以看数据库应用的性能,主要看据库连结的利用率,所以,DataSource可以说是J2EE最最重要的应

用.

对于主流的数据库,如mysql,mssqlserver,oracle,从其通用的性能来看,我建议在JAVA平台上应用oracle和mysql,MS的数

据库在JAVA平台上的性能只能达到上述两种数据库的60-70%,在相同硬件的基础是,做同样的操作,测试了这三种数

据库对并发的支持,MYSQL最高为430,ORACLE为400,SQLSERVER只有250.

如果你不得不用SQLSERVER作为JAVA平台的数据库,那么一个合适的JDBC是最最重要的,MS自己提供的JDBC到目前为

止并不能真正支持DataSource,不过bea的weblogic8中已经内置了type4的ms sqlserver的JDBC,这是一个真正支

持DataSource的JDBC,如果你不得不用sqlserver,你可以把这个JDBC从BEA的WLS中驳离出来.

另外一点,如果你的J2EE应用主要集中在jsp/servlet,而后台数据库采用oracle的话,那么你有福了.你不要采用其它

的WEB容器,在oracle8.17以后的版本中都内置了servlet引擎.

如果你基于这个引擎,你会获得其它应用组合所无法比拟的性能,因为ORACLE的WEB容器是工作在数据库的地址空

间,想一想,这意味着什么?


这就意味着,容器对数据库的访问是"本地文件存取方式",虽然oracle也提供了标准的JDBC接口让调用者调用,但事实

上这时的Connection对象只相当于一个文件句柄,而其它的JDBC连结都是封装了Socket,通过Socket和数据库进行通讯,

如果你不理解这里的区别,那我打一个比方:就好象两个人面对面谈话和通过国际长途谈话的区别,这其间的性能怎

一个高字了得.

mysql从来就是被设计为"网络数据库",针对数据安全性不是太重要的应用.它的最大优点是通用,性能高,速度快,安

全性较低,对于不是机密要件的应用,用MYSQL肯定没错.

MS SQLSERVER,除了在JAVA平台上性能表现不好外,没有什么可说的,如果换在WIN平台上,它是顶级首选项,没有任何

数据库在WIN平台上可以和它做任何方面的比较.

ORACLE,JAVA平台上的老大,除去成本因素,在JAVA平台上没有理由不选择它.
本来不想写这部份入门级的内容,但既然栏目定为JDBC专栏,还是简单写一些吧.

来,我们认识一下!
JDBC,JAVA平台的DATABASE的连通性.白话一句,什么意思啊?
就是JAVA平台上和数据库进行连结的"工具".

还是先一起来回顾一下接口吧:从下向上,接口是对"案例"的抽象,由一个案例抽象出一些规则.
反过来,从上向下,被抽象出来的接口是对案例的一种承诺和约束.
也就是说,只要你实现我规定的接口,你的类就已经具有了接口对外承诺的方法,只要"客户"会
操作接口,不需要重新学习就会操作实现了该接口的新类!
好了,用行话来说:
1.通过接口可以实现不相关的类的相同行为.
2.通过接口可以指明多个类需要实现的方法.
3.通过接口可以了解对象的交互方法而不需要了解对象所对应的类蓝本.
这几句话很明白吧?好象有一本什么模式的书把这段话用了30多页写出来,结果别人看了还不如
我这几句话明白,不过我明白了为什么有些人要写书了.

搞懂了以上这东西,JDBC就好明白了.
为了通用,JAVA中要求有一种机制,在操作不同厂商数据库时有相同的方法去操作,而不是每接
触一种数据库就要学习新的方法.完成这种机制的"东西"就叫"JDBC"了.
简单地分,JDBC有两部分组成,JDBC API和JDBC Driver Interface.
JDBC API就是提供给"客户"(就是象你我这种菜鸟级程序员来用的,如果是高手都自己写JDBC了,
哈哈)的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行.那么要把这些通用的API
翻译成特定数据库能懂的"指令",就要由JDBC Driver Interface来实现了,所以这部份是面向JDBC驱动程
序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库.


还是通过实际操作来看看JDBC如何工作的吧.

因为JDBC API是通用接口,那么程序是如何知道我要连结的是哪种数据库呢?所以在和数据库连
结时先要加载(或注册可用的Driver),其实就是JDBC签名.加载驱动程序和好多方法,最常用的就是先把驱
动程序类溶解到内存中,作为"当前"驱动程序.注意"当前"是说内存中可以有多个驱动程序,但只有现在加
载的这个作为首选连结的驱动程序.
Class.forName("org.gjt.mm.mysql.Driver");
Class.forName方法是先在内存中溶解签名为"org.gjt.mm.mysql.Driver"的Driver类,Driver类
就会把相应的实现类对应到JDBC API的接口中.比如把org.gjt.mm.mysql.Connection的实例对象赋给
java.sql.Connection接口句柄,以便"客户"能通过操作java.sql.Connection句柄来调用实际的
org.gjt.mm.mysql.Connection中的方法.之于它们是如果映射的,这是厂商编程的,"客户"只要调用
Class.forName("org.gjt.mm.mysql.Driver");方法就可以顺利地操作JDBC API了.

一个普通数据库的连结过程为:
1.加载驱动程序.
2.通过DriverManager到得一个与数据库连结的句柄.
3.通过连结句柄绑定要执行的语句.
4.接收执行结果.
5.可选的对结果的处理.
6.必要的关闭和数据库的连结.
因为是基础篇,所以还是对每一步骤简单说明一下吧:

前面说是,注册驱动程序有多方法,Class.forName();是一种显式地加载.当一个驱
动程序类被Classloader装载后,在溶解的过程中,DriverManager会注册这个驱动类的实例.
这个调用是自动发生的,也就是说DriverManager.registerDriver()方法被自动调用了,当然
我们也可以直接调用DriverManager.registerDriver()来注册驱动程序,但是,以我的经验.
MS的浏览中APPLET在调用这个方法时不能成功,也就是说MS在浏览器中内置的JVM对该方法的
实现是无效的.
另外我们还可以利用系统属性jdbc.drivers来加载多个驱动程序:
System.setProperty("jdbc.drivers","driver1:driver2:.....:drivern");多个驱动程序之
间用":"隔开,这样在连结时JDBC会按顺序搜索,直到找到第一个能成功连结指定的URL的驱动
程序.
在基础篇里我们先不介绍DataSource这些高级特性.

在成功注册驱动程序后,我们就可以用DriverManager的静态方法getConnection来得
到和数据库连结的引用:
Connection conn = DriverManager.getConnection(url);
如果连结是成功的,则返回Connection对象conn,如果为null或抛出异常,则说明没有
和数据库建立连结.
对于getConnection()方法有三个重载的方法,一种是最简单的只给出数据源即:
getConnection(url),另一种是同时给出一些数据源信息即getConnection(url,Properties),
另外一种就是给出数据源,用户名和密码:getConnection(url,user,passwod),对于数据源信息.
如果我们想在连结时给出更多的信息可以把这些信息压入到一个Properties,当然可以直接压
入用户名密码,别外还可以压入指定字符集,编码方式或默认操作等一些其它信息.

在得到一个连结后,也就是有了和数据库找交道的通道.我们就可以做我们想要的操
作了.
还是先来介绍一些一般性的操作:
如果我们要对数据库中的表进行操作,要先缘故绑定一个语句:
Statement stmt = conn.createStatement();
然后利用这个语句来执行操作.根本操作目的,可以有两种结果返回,如果执行的查询
操作,返回为结果集ResultSet,如果执行更新操作,则返回操作的记录数int.
注意,SQL操作严格区分只有两个,一种就是读操作(查询操作),另一种就是写操作(更
新操作),所以,create,insert,update,drop,delete等对数据有改写行为的操作都是更新操作.

ResultSet rs = stmt.executeQuery("select * from table where xxxxx");
int x = stmt.executeUpdate("delete from table where ......");
如果你硬要用executeQuery执行一个更新操作是可以的,但不要把它赋给一个句柄,
当然稍微有些经验的程序员是不会这么做的.
至于对结果集的处理,我们放在下一节讨论,因为它是可操作的可选项,只有查询操作
才返回结果集,对于一次操作过程的完成,一个非常必要的步骤是关闭数据库连结,在你没有了
解更多的JDBC知识这前,你先把这一步骤作为JDBC操作中最最重要的一步,在以后的介绍中我会
不断地提醒你去关闭数据库连结!!!!!!!!!!!

按上面介绍的步骤,一个完成的例子是这样的:(注意,为了按上面的步骤介绍,这个例
子不是最好的)
try{
Class.forName("org.gjt.mm.mysql.Driver");
}catch(Exception e){
System.out.println("没有成功加载驱动程序:"+e.toString());
return;
}//对于象我这样的经验,可以直接从e.toString()的简单的几个字判断出异常原因,
//如果你是一个新手应该选捕获它的子类,如何知道要捕获哪几个异常呢?一个简单
//的方法就是先不加try{},直接Class.forName("org.gjt.mm.mysql.Driver");,编
//译器就会告诉你要你捕获哪几个异常了,当然这是偷机取巧的方法,最好还是自己
//去看JDK文档,它会告诉你每个方法有哪些异常要你捕获.
Connection conn = null;
try{
conn = DriverManager.getConnection(
"jdbc:mysql://host:3306/mysql",
"user",
"passwd");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from table");
//rs 处理
[rs.close();]
[stmt.close();]
}
catch(Exception e){
System.out.println("数据库操作出现异常:"+e.toString());
}
finally{
try{conn.close();}catch(Exception){}
}//不管你以前是学习到的关于数据库流程是如何操作的,如果你相信我,从现在开始,
//请你一定要把数据库关闭的代码写到finally块中,切切!
关于Statement对象:
前面说过,Statement对象是用来绑定要执行的操作的,在它上面有三种执行方法:
即用来执行查询操作的executeQuery(),用来执行更新操作的executeUpdate()和用来执行
动态的未知的操作的execute().
JDBC在编译时并不对要执行的SQL语句检测,只是把它看着一个String,只有在驱动
程序执行SQL语句时才知道正确与否.
一个Statement对象同时只能有一个结果集在活动.这是宽容性的,就是说即使没有
调用ResultSet的close()方法,只要打开第二个结果集就隐含着对上一个结果集的关闭.所以
如果你想同时对多个结果集操作,就要创建多个Statement对象,如果不需要同时操作,那么可
以在一个Statement对象上须序操作多个结果集.

这里我不得不特别说明一下,很多人会用一个Statement进行嵌套查询,然后就来问
我说为什么不能循环?道理上面已经说清楚了.我们来详细分析一下嵌套查询:
Connection conn = null;
Statement stmt = null;
conn = .......;
stmt = conm.createStatement(xxxxxx);
ResultSet rs = stmt.executeQuery(sql1);
while(rs.next()){
str = rs.getString(xxxxx);
ResultSet rs1 = stmt.executeQuery("select * from 表 where 字段=str");
}
当stmt.executeQuery("select * from 表 where 字段=str");赋给rs1时,这时隐含的操作
是已经关闭了rs,你还能循环下去吗?
所以如果要同时操作多个结果集一定要让它他绑定到不同的Statement对象上.好在一个connection
对象可以创建任意多个Statement对象,而不需要你重新获取连结.

关于获取和设置Statement的选项:只要看看它的getXXX方法和setXXX方法就明白了,这儿
作为基础知识只提一下以下几个:
setQueryTimeout,设置一个SQL执行的超时限制.
setMaxRows,设置结果集能容纳的行数.
setEscapeProcessing,如果参数为true,则驱动程序在把SQL语句发给数据库前进行转义替
换,否则让数据库自己处理,当然这些默认值都可以通过get方法查询.

Statement的两个子类:
PreparedStatement:对于同一条语句的多次执行,Statement每次都要把SQL语句发送给数据
库,这样做效率明显不高,而如果数据库支持预编译,PreparedStatement可以先把要执行的语句一次发
给它,然后每次执行而不必发送相同的语句,效率当然提高,当然如果数据库不支持预编译,
PreparedStatement会象Statement一样工作,只是效率不高而不需要用户工手干预.
另外PreparedStatement还支持接收参数.在预编译后只要传输不同的参数就可以执行,大大
提高了性能.

PreparedStatement ps = conn.prepareStatement("select * from 表 where 字段=?");
ps.setString(1,参数);
ResultSet rs = ps.executeQuery();

CallableStatement:是PreparedStatement的子类,它只是用来执行存储过程的.
CallableStatement sc = conn.prepareCall("{call query()}");
ResultSet rs = cs.executeQuery();


















分享到:
评论

相关推荐

    JDBC 4.3规范文档

    规范文档还包含了更多技术性的描述,关于JDBC驱动、连接数据库、执行SQL语句、事务管理、元数据处理和资源管理等核心概念和技术的详细说明。 在学习JDBC的过程中,了解其规范是至关重要的。它不仅提供了接口的定义...

    JDBC课件,关于JDBC使用

    - **ResultSetMetaData类**:提供关于ResultSet列的信息,如列数量、名称、类型等。 - **DatabaseMetaData类**:提供了获取数据库元数据的方法,如数据库版本、表信息、列信息等。 **JDBC使用流程** 1. 加载并注册...

    jdbc学习手册 jdbc

    ### JDBC学习手册精要 #### 一、JDBC概述 JDBC(Java DataBase Connectivity),即Java数据库连接,是由Sun Microsystems(现已被Oracle收购)制定的一种用于执行SQL语句的Java API,它可以为多种关系数据库提供...

    JDBC学习笔记--JDBC学习笔记

    JDBC学习笔记 JDBC(Java DataBase Connectivity)是一种Java程序语言访问数据库的标准接口。它使得Java程序可以连接到各种不同的数据库管理系统,例如Oracle、SQL Server、MySQL、DB2、Sybase等。 JDBC的概念 ...

    jdbc资料jdbc资料jdbc资料pdf

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

    JDBC主要API介绍.pdf

    JDBC(Java Database Connectivity)是Java语言用于数据库连接的一套API。它为开发者提供了一种操作数据库的标准化方法,允许Java程序执行SQL语句并返回结果。JDBC API位于java.sql和javax.sql包中,其中java.sql是...

    jdbc java file config

    白皮书中提供了一个关于如何连接到Progress数据库的示例,这对于理解如何在Java应用程序中使用JDBC驱动程序至关重要。文件也强调了其他必要组件的安装,比如Progress SQL Explorer,它是用于数据库管理的工具。连接...

    Access_JDBC30

    至于压缩包内的文件结构,"META-INF"目录通常包含关于jar包的元数据,如MANIFEST.MF文件,它列出了jar包的主要属性,包括哪些类或模块被包含以及它们的版本信息。"com"目录则很可能包含了具体的Java源代码或编译后的...

    ApacheCamel-JDBC

    JDBC(Java Database Connectivity)是Java平台中的一个标准API,用于与各种数据库进行交互。Apache Camel 的 JDBC 组件就是将这两个强大的工具结合在一起,使开发者能够方便地在Camel路由中执行SQL查询和操作数据库...

    jdbc核心代码.docx

    JDBC核心代码详解 在本文中,我们将详细解释JDBC(Java Database Connectivity)的核心代码,涵盖了JDBC的基本概念、步骤、语句和实践操作。 JDBC概述 JDBC是Java语言中用于连接数据库的API(Application ...

    关于Universe和IDT链接数据库的JDBC配置

    ### 关于Universe和IDT链接数据库的JDBC配置 #### 一、概述 在SAP Business Objects(BO)环境中,Universe是用于定义数据结构和业务逻辑的关键组件,而Intelligent Data Transformation (IDT)则是一种强大的工具...

    gt-jdbc-2.6.5.jar_oracle_jdbc_Geotools_

    标题中的“gt-jdbc-2.6.5.jar”是一个Java数据库连接(JDBC)驱动程序,用于连接Oracle数据库,并且是Geotools项目的一部分。Geotools是一个开源的Java库,专门用于处理地理空间数据,它提供了丰富的API来操作和展示...

    hana jdbc ngdbc.jar com.sap.db.jdbc.Driver

    指的是 SAP HANA 数据库的 JDBC 驱动程序,其核心组件是一个名为 `ngdbc.jar` 的 Java 类库。这个驱动程序允许 Java 应用程序通过 JDBC(Java Database Connectivity)接口与 SAP HANA 数据库进行交互。JDBC 是一个...

    Oracle12C JDBC 驱动

    Oracle12C JDBC驱动是连接Java应用程序与Oracle数据库12c Release 2 (12.2.0.1) 的关键组件。JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java程序通过Java语言来访问和操作数据库。在...

    JDBC主要api介绍

    以下是关于JDBC的详细介绍: 首先,JDBC API主要包含在java.sql和javax.sql两个包中。java.sql包是核心包,包含了基本的JDBC功能和类,而javax.sql包则提供了一些扩展功能,如数据源和连接池等。JDBC中最常用的接口...

    hive jdbc依赖的jar包

    Hive JDBC是Apache Hive项目的一部分,它提供了一个Java数据库连接(JDBC)接口,使得其他应用程序,如Python、Java或任何支持JDBC的环境,能够与Hive进行交互。Hive JDBC驱动程序允许用户通过标准的JDBC API来执行...

    各数据库JDBC驱动程序

    在IT行业中,Java Database Connectivity(JDBC)是一个用于执行SQL语句的标准Java API,它使得Java程序员能够连接到各种类型的数据库。本主题将深入探讨针对sqlserver、mysql和oracle这三种常见数据库的JDBC驱动...

    spring-jdbc jar包.rar

    《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...

    关于JDBC的详细介绍

    ### 关于JDBC的详细介绍 #### 一、JDBC概览 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系型数据库提供统一访问,简化了Java开发人员对数据库的操作。从物理结构上看,...

Global site tag (gtag.js) - Google Analytics