JDBC.docx
- 文档编号:5311903
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:26
- 大小:37.09KB
JDBC.docx
《JDBC.docx》由会员分享,可在线阅读,更多相关《JDBC.docx(26页珍藏版)》请在冰点文库上搜索。
JDBC
编辑本段定义
JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯JavaAPI编写数据库应用程序,同时,JDBC也是个商标名。
有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。
换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用。
同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。
Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。
JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。
作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。
JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。
JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。
Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。
所需要的只是Java应用程序与各种不同数据库之间进行对话的方法。
而JDBC正是作为此种用途的机制。
JDBC扩展了Java的功能。
例如,用Java和JDBCAPI可以发布含有applet的网页,而该applet使用的信息可能来自远程数据库。
企业也可以用JDBC通过Intranet将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有Windows、Macintosh和UNIX等各种不同的操作系统)。
随着越来越多的程序员开始使用Java编程语言,对从Java中便捷地访问数据库的要求也在日益增加。
MIS管理员们都喜欢Java和JDBC的结合,因为它使信息传播变得容易和经济。
企业可继续使用它们安装好的数据库,并能便捷地存取信息,即使这些信息是储存在不同数据库管理系统上。
新程序的开发期很短。
安装和版本控制将大为简化。
程序员可只编写一遍应用程序或只更新一次,然后将它放到服务器上,随后任何人就都可得到最新版本的应用程序。
对于商务上的销售信息服务,Java和JDBC可为外部客户提供获取信息更新的更好方法。
编辑本段用途
简单地说,JDBC可做三件事:
与数据库建立连接、发送操作数据库的语句并处理结果。
下列代码段给出了以上三步的基本示例:
Connectioncon=DriverManager.getConnection("jdbc:
odbc:
wombat","login",
"password");
Statementstmt=con.createStatement();
ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTable1");
while(rs.next()){
intx=rs.getInt("a");
Strings=rs.getString("b");
floatf=rs.getFloat("c");
}
上述代码对基于JDBC的数据库访问做了经典的总结,当然,在本小节的后续部分会对它做详尽的分析讲解。
编辑本段API
JDBC是个"低级"接口,也就是说,它用于直接调用SQL命令。
在这方面它的功能极佳,并比其它的数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。
高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的API,这种API在幕后被转换为诸如JDBC这样的低级接口。
在关系数据库的"对象/关系"映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。
于是,程序员可直接对Java对象进行操作;存取数据所需的SQL调用将在"掩盖下"自动生成。
此外还可提供更复杂的映射,例如将多个表中的行结合进一个Java类中。
随着人们对JDBC的兴趣日益增涨,越来越多的开发人员一直在使用基于JDBC的工具,以使程序的编写更加容易。
程序员也一直在编写力图使最终用户对数据库的访问变得更为简单的应用程序。
例如应用程序可提供一个选择数据库任务的菜单。
任务被选定后,应用程序将给出提示及空白供填写执行选定任务所需的信息。
所需信息输入应用程序将自动调用所需的SQL命令。
在这样一种程序的协助下,即使用户根本不懂SQL的语法,也可以执行数据库任务。
编辑本段与ODBC和其它API的比较
目前,Microsoft的ODBCAPI可能是使用最广的、用于访问关系数据库的编程接口。
它能在几乎所有平台上连接几乎所有的数据库。
为什么Java不使用ODBC?
对这个问题的回答是:
Java可以使用ODBC,但最好是在JDBC的帮助下以JDBC-ODBC桥的形式使用,这一点我们稍后再说。
现在的问题已变成:
"为什么需要JDBC"?
答案是显然的:
ODBC不适合直接在Java中使用,因为它使用C语言接口。
从Java调用本地C代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。
从ODBCCAPI到JavaAPI的字面翻译是不可取的。
例如,Java没有指针,而ODBC却对指针用得很广泛(包括很容易出错的指针"void*")。
您可以将JDBC想象成被转换为面向对象接口的ODBC,而面向对象的接口对Java程序员来说较易于接受。
ODBC很难学。
它把简单和高级功能混在一起,而且即使对于简单的查询,其选项也极为复杂。
相反,JDBC尽量保证简单功能的简便性,而同时在必要时允许使用高级功能。
启用"纯Java"机制需要象JDBC这样的JavaAPI。
如果使用ODBC,就必须手动地将ODBC驱动程序管理器和驱动程序安装在每台客户机上。
如果完全用Java编写JDBC驱动程序则JDBC代码在所有Java平台上(从网络计算机到大型机)都可以自动安装、移植并保证安全性。
总之,JDBCAPI对于基本的SQL抽象和概念是一种自然的Java接口。
它建立在ODBC上而不是从零开始。
因此,熟悉ODBC的程序员将发现JDBC很容易使用。
JDBC保留了ODBC的基本设计特征;事实上,两种接口都基于X/OpenSQLCLI(调用级接口)。
它们之间最大的区别在于:
JDBC以Java风格与优点为基础并进行优化,因此更加易于使用。
目前,Microsoft又引进了ODBC之外的新API:
RDO、ADO和OLEDB。
这些设计在许多方面与JDBC是相同的,即它们都是面向对象的数据库接口且基于可在ODBC上实现的类。
但在这些接口中,我们未看见有特别的功能使我们要转而选择它们来替代ODBC,尤其是在ODBC驱动程序已建立起较为完善的市场的情况下。
它们最多也就是在ODBC上加了一种装饰而已。
编辑本段对B/S和C/S模式的支持
JDBCAPI既支持数据库访问的两层模型(C/S),同时也支持三层模型(B/S)。
在两层模型中,Javaapplet或应用程序将直接与数据库进行对话。
这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通讯。
用户的SQL语句被送往数据库中,而其结果将被送回给用户。
数据库可以位于另一台计算机上,用户通过网络连接到上面。
这就叫做客户机/服务器配置,其中用户的计算机为客户机,提供数据库的计算机为服务器。
网络可以是Intranet(它可将公司职员连接起来),也可以是Internet。
在三层模型中,命令先是被发送到服务的"中间层",然后由它将SQL语句发送给数据库。
数据库对SQL语句进行处理并将结果送回到中间层,中间层再将结果送回给用户。
MIS主管们都发现三层模型很吸引人,因为可用中间层来控制对公司数据的访问和可作的的更新的种类。
中间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。
最后,许多情况下三层结构可提供一些性能上的好处。
到目前为止,中间层通常都用C或C++这类语言来编写,这些语言执行速度较快。
然而,随着最优化编译器(它把Java字节代码转换为高效的特定于机器的代码)的引入,用Java来实现中间层将变得越来越实际。
这将是一个很大的进步,它使人们可以充分利用Java的诸多优点(如坚固、多线程和安全等特征)。
JDBC对于从Java的中间层来访问数据库非常重要。
编辑本段SQL的一致性
结构化查询语言(SQL)是访问关系数据库的标准语言。
困难之处在于:
虽然大多数的DBMS(数据库管理系统)对其基本功能都使用了标准形式的SQL,但它们却不符合最近为更高级的功能定义的标准SQL语法或语义。
例如,并非所有的数据库都支持储存程序或外部连接,那些支持这一功能的数据库又相互不一致。
人们希望SQL中真正标准的那部份能够进行扩展以包括越来越多的功能。
但同时JDBCAPI又必须支持现有的SQL。
JDBCAPI解决这个问题的一种方法是允许将任何查询字符串一直传到所涉及的DBMS驱动程序上。
这意味着应用程序可以使用任意多的SQL功能,但它必须冒这样的风险:
有可能在某些DBMS上出错。
事实上,应用程序查询甚至不一定要是SQL,或者说它可以是个为特定的DBMS设计的SQL的专用派生物(例如,文档或图象查询)。
JDBC处理SQL一致性问题的第二种方法是提供ODBC风格的转义子句,这将在后续部分中讨论。
转义语法为几个常见的SQL分歧提供了一种标准的JDBC语法。
例如,对日期文字和已储存过程的调用都有转义语法。
对于复杂的应用程序,JDBC用第三种方法来处理SQL的一致性问题它利用DatabaseMetaData接口来提供关于DBMS的描述性信息,从而使应用程序能适应每个DBMS的要求和功能。
由于JDBCAPI将用作开发高级数据库访问工具和API的基础API,因此它还必须注意其所有上层建筑的一致性。
"符合JDBC标准TM"代表用户可依赖的JDBC功能的标准级别。
要使用这一说明,驱动程序至少必须支持ANSISQL-2EntryLevel(ANSISQL-2代表美国国家标准局1992年所采用的标准。
EntryLevel代表SQL功能的特定清单)。
驱动程序开发人员可用JDBCAPI所带的测试工具包来确定他们的驱动程序是否符合这些标准。
"符合JDBC标准TM"表示提供者的JDBC实现已经通过了JavaSoft提供的一致性测试。
这些一致性测试将检查JDBCAPI中定义的所有类和方法是否都存在,并尽可能地检查程序是否具有SQLEntryLevel功能。
当然,这些测试并不完全,而且JavaSoft目前也无意对各提供者的实现进行标级。
但这种一致性定义的确可对JDBC实现提供一定的可信度。
随着越来越多的数据库提供者、连接提供者、Internet提供者和应用程序编程员对JDBCAPI的接受,JDBC也正迅速成为Java数据库访问的标准。
编辑本段入门-建立联接
装载驱动程序
你需要做的第一事情是你与想要使用的DBMS建立一个连接。
这包含2个步骤:
装载驱动程序并建立连接。
装载驱动程序只需要非常简单的一行代码。
例如,你想要使用JDBC-ODBC桥驱动程序,可以用下列代码装载它:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
你的驱动程序文档将告诉你应该使用的类名。
例如,如果类名是jdbc.DriverXYZ,你将用代码以下的代码装载驱动程序:
Class.forName("jdbc.DriverXYZ");
你不需要创建一个驱动程序类的实例并且用DriverManager登记它,因为调用Class.forName将自动将加载驱动程序类。
如果你曾自己创建实例,你将创建一个不必要的副本,但它不会带来什么坏处。
加载Driver类后,它们即可用来与数据库建立连接。
建立连接
第二步就是用适当的驱动程序类与DBMS建立一个连接。
下列代码是一般的做法:
Connectioncon=DriverManager.getConnection(url,"myLogin","myPassword");
这个步骤也非常简单,最难的是怎么提供url。
如果你正在使用JDBC-ODBC桥,JDBCURL将以jdbc:
odbc开始:
余下URL通常是你的数据源名字或数据库系统。
因此,假设你正在使用ODBC存取一个叫"Fred"的ODBC数据源,你的JDBCURL是jdbc:
odbc:
Fred。
把"myLogin"及"myPassword"替换为你登陆DBMS的用户名及口令。
如果你登陆数据库系统的用户名为"Fernanda"口令为"J8",只需下面的2行代码就可以建立一个连接:
Stringurl="jdbc:
odbc:
Fred";
Connectioncon=DriverManager.getConnection(url,"Fernanda","J8");
如果你使用的是第三方开发了的JDBC驱动程序,文档将告诉你该使用什么subprotocol,就是在JDBCURL中放在jdbc后面的部分。
例如,如果驱动程序开发者注册了acme作为subprotocol,JDBCURL的第一和第二部分将是jdbc:
acme。
驱动程序文档也会告诉你余下JDBCURL的格式。
JDBCURL最后一部分提供了定位数据库的信息。
如果你装载的驱动程序识别了提供给DriverManager.getConnection的JDBCURL,那个驱动程序将根据JDBCURL建立一个到指定DBMS的连接。
正如名称所示,DriverManager类在幕后为你管理建立连接的所有细节。
除非你是正在写驱动程序,你可能无需使用此类的其它任何方法,一般程序员需要在此类中直接使用的唯一方法是DriverManager.getConnection。
DriverManager.getConnection方法返回一个打开的连接,你可以使用此连接创建JDBCstatements并发送SQL语句到数据库。
在前面的例子里,con对象是一个打开的连接,并且我们要在以后的例子里使用它。
编辑本段入门-设置表
创建表
首先,我们在我们的示例数据库创建其中一张表COFFEES,包含在咖啡店所卖咖啡的必要的信息,包括咖啡名字,他们的价格,本星期卖了多少磅及迄今为止卖的数目。
关于COFFEES表我们以后会详细描述,如下:
我们写了创建COFFEES表的SQL语句。
现在我们在它外面加上引号(使它成为字符串),并且字符串赋值给变量createTableCoffees,在以后的JDBC代码中我们可以使用此变量。
正如看到的,DBMS并不在意分行,但对Java语言来,String对象分行是通不过编译的。
因而,我们可以用加号(+)把每一行的串连接。
StringcreateTableCoffees="CREATETABLECOFFEES"+
"(COF_NAMEVARCHAR(32),SUP_IDINTEGER,PRICEFLOAT,"+
"SALESINTEGER,TOTALINTEGER)";
我们在CREATETABLE语句中使用的数据类型是通用的SQL类型(也称JDBC类型)它们在类java.sql.Types中定义。
DBMSs通常使用这些标准的类型,因此,当你要尝试一些JDBC应用程序时,你可以直接使用CreateCoffees.java应用程序,它使用了CREATETABLE语句。
如果你的DBMS使用了它的自己的本地的类型名字,我们为你供应其它的应用程序,我们将在后面详细解释。
在运用任何应用程序前,当然,我们将让你了解JDBC的基础。
创建对象
Statement对象用于把SQL语句发送到DBMS。
你只须简单地创建一个Statement对象并且然后执行它,使用适当的方法执行你发送的SQL语句。
对SELECT语句来说,可以使用executeQuery。
要创建或修改表的语句,使用的方法是executeUpdate。
需要一个活跃的连接的来创建Statement对象的实例。
在下面的例子中,我们使用我们的Connection对象con创建Statement对象stmt:
Statementstmt=con.createStatement();
到此stmt已经存在了,但它还没有把SQL语句传递到DBMS。
我们需要提供SQL语句作为参数提供给我们使用的Statement的方法。
例如,在下面的代码段里,我们使用上面例子中的SQL语句作为executeUpdate的参数:
stmt.executeUpdate("CREATETABLECOFFEES"+
"(COF_NAMEVARCHAR(32),SUP_IDINTEGER,PRICEFLOAT,"+
"SALESINTEGER,TOTALINTEGER)");
因为我们已经把SQL语句赋给了createTableCoffees变量,我们可以如下方式书写代码:
stmt.executeUpdate(createTableCoffees);
执行语句
我们使用executeUpdate方法是因为在createTableCoffees中的SQL语句是DDL(数据定义语言)语句。
创建表,改变表,删除表都是DDL语句的例子,要用executeUpdate方法来执行。
你也可以从它的名字里看出,方法executeUpdate也被用于执行更新表SQL语句。
实际上,相对于创建表来说,executeUpdate用于更新表的时间更多,因为表只需要创建一次,但经常被更新。
被使用最多的执行SQL语句的方法是executeQuery。
这个方法被用来执行SELECT语句,它几乎是使用最多的SQL语句。
马上你将看到如何使用这个方法。
在表中输入数据
我们已经显示了如何通过指定列名、数据类型来创建表COFFEES,但是这仅仅建立表的结构。
表还没有任何数据。
我们将次输入一行数据到表中,提供每列的信息,注意插入的数据显示顺序跟表创建时候是一样的,既缺省顺序。
下列代码插入一个行数据,COF_NAME的值为Colombian,SUP_ID为101,PRICE为7.99,SALES0,TOTAL0。
就象创建COFFEES表一样,我们创建一Statement对象,并执行executeUpdate方法。
因为SQL语句一行显示不下,因此我们把它分为两行,并用加号(+)相连。
特别要注意的是,在COFFEES和VALUES之间要有空格。
这个空格必须在引号之内并且要在COFFEES跟VALUES之间;没有这个空格,SQL语句将被错误地被读作为"INSERTINTOCOFFEESVALUES...",并且DBMS将寻找表COFFEESVALUES。
还要注意的是在coffeename上我们使用了单引号。
Statementstmt=con.createStatement();
stmt.executeUpdate(
"INSERTINTOCOFFEES"+
"VALUES('Colombian',101,7.99,0,0)");
下面的代码把第二行插入到表COFFEES中。
我们可以在使用Statement对象而无须为每次执行创建一个新的。
stmt.executeUpdate("INSERTINTOCOFFEES"+
"VALUES('French_Roast',49,8.99,0,0)");
剩下行的数据如下:
stmt.executeUpdate("INSERTINTOCOFFEES"+
"VALUES('Espresso',150,9.99,0,0)");
stmt.executeUpdate("INSERTINTOCOFFEES"+
"VALUES('Colombian_Decaf',101,8.99,0,0)");
stmt.executeUpdate("INSERTINTOCOFFEES"+
"VALUES('French_Roast_Decaf',49,9.99,0,0)");
从表中取得数据
既然表COFFEES中已经有数据了,我们就可以写一个SELECT语句来取得这些值。
下面的SQL语句中星号(*)表示选择所有的列。
因为没有用WHERE子句来限制所选的行,因此下面的SQL语句选择的是整个表。
SELECT*FROMCOFFEES
结果是整个表的数据,如下:
COF_NAMESUP_IDPRICESALESTOTAL
------------------------------------
Colombian1017.9900
French_Roast498.9900
Espresso1509.9900
Colombian_Decaf1018.9900
French_Roast_Decaf499.9900
如果你直接在数据库系统里输入SQL查询语句,你将在你的终端上看到如上的结果。
当我们通过一个Java应用程序存取一个数据库时,正如我们马上要做的一样,我们需要检索结果以便我们能使用他们。
你将在下一节看到如何实现。
这是SELECT语句的另一个例子,这将得到咖啡及其各自每磅单价的列表。
SELECTCOF_NAME,PRICEFROMCOFFEE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDBC