最新java与数据库的连接.docx

上传人:b****4 文档编号:4988335 上传时间:2023-05-07 格式:DOCX 页数:51 大小:896.98KB
下载 相关 举报
最新java与数据库的连接.docx_第1页
第1页 / 共51页
最新java与数据库的连接.docx_第2页
第2页 / 共51页
最新java与数据库的连接.docx_第3页
第3页 / 共51页
最新java与数据库的连接.docx_第4页
第4页 / 共51页
最新java与数据库的连接.docx_第5页
第5页 / 共51页
最新java与数据库的连接.docx_第6页
第6页 / 共51页
最新java与数据库的连接.docx_第7页
第7页 / 共51页
最新java与数据库的连接.docx_第8页
第8页 / 共51页
最新java与数据库的连接.docx_第9页
第9页 / 共51页
最新java与数据库的连接.docx_第10页
第10页 / 共51页
最新java与数据库的连接.docx_第11页
第11页 / 共51页
最新java与数据库的连接.docx_第12页
第12页 / 共51页
最新java与数据库的连接.docx_第13页
第13页 / 共51页
最新java与数据库的连接.docx_第14页
第14页 / 共51页
最新java与数据库的连接.docx_第15页
第15页 / 共51页
最新java与数据库的连接.docx_第16页
第16页 / 共51页
最新java与数据库的连接.docx_第17页
第17页 / 共51页
最新java与数据库的连接.docx_第18页
第18页 / 共51页
最新java与数据库的连接.docx_第19页
第19页 / 共51页
最新java与数据库的连接.docx_第20页
第20页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

最新java与数据库的连接.docx

《最新java与数据库的连接.docx》由会员分享,可在线阅读,更多相关《最新java与数据库的连接.docx(51页珍藏版)》请在冰点文库上搜索。

最新java与数据库的连接.docx

最新java与数据库的连接

 

java与数据库的连接

Java数据库连接,(JavaDatabaseConnectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

JDBC也是SunMicrosystems的商标1。

它JDBC是面向关系型数据库的。

程序类型

  [1]JDBC驱动程序共分四种类型:

类型1

  JDBC-ODBC桥

  这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。

类型2

  本地API驱动

  这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。

类型3

  网络协议驱动

  这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。

  本地协议驱动

  这种类型的驱动使用Socket,直接在客户端和数据库间通信。

编辑本段API概述

  JDBCAPI主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(斜体代表接口,需驱动程序提供者来具体实现):

  DriverManager:

负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。

Driver:

驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。

Connection:

数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。

可以产生用以执行SQL的Statement。

Statement:

用以执行SQL查询和更新(针对静态SQL语句和单次执行)。

PreparedStatement:

用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。

CallableStatement:

用以调用数据库中的存储过程。

SQLException:

代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况(即错误)。

  数据类型的映射

  

从SQL到Java数据类型映射的JDBC规范

SQL类型

Java类型

CHAR

java.lang.String

VARCHAR

java.lang.String

LONGVARCHAR

java.lang.String

NUMERIC

java.math.BigDecimal

DECIMAL

java.math.BigDecimal

BIT

boolean

TINYINT

byte

SMALLINT

short

INTEGER

int

BIGINT

long

REAL

float

FLOAT

double

DOUBLE

double

BINARY

byte[]

VARBINARY

byte[]

LONGVARBINARY

byte[]

DATE

java.sql.Date

TIME

java.sql.Time

TIMESTAMP

java.sql.Timestamp

BLOB

java.sql.Blob

CLOB

java.sql.Clob

Array

java.sql.Array

REF

java.sql.Ref

Struct

java.sql.Struct

注:

这种类型匹配不是强制性标准,特定的JDBC厂商可能会改变这种类型匹配。

例如Oracle中的DATE类型是包含时分秒,而java.sql.Date仅仅支持年月日。

编辑本段连接方式

  下面罗列了各种数据库使用JDBC连接的方式:

  ⒈Oracle8/8i/9i数据库(thin模式)

  ⒉DB2数据库

  ⒊SqlServer7.0/2000数据库

  ⒋Sybase数据库

  ⒌Informix数据库

  ⒍MySQL数据库

  ⒎PostgreSQL数据库

  ⒏access数据库直连用ODBC的

编辑本段主要用途

  与数据库建立连接

  发送SQL语句

  处理结果

编辑本段连接API

  JDBC是个"低级"接口,也就是说,它用于直接调用SQL命令。

在这方面它的功能极佳,并比其它的数据库连接API易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。

高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的API,这种API在幕后被转换为诸如JDBC这样的低级接口。

  在关系数据库的"对象/关系"映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。

于是,程序员可直接对Java对象进行操作;存取数据所需的SQL调用将在"掩盖下"自动生成。

此外还可提供更复杂的映射,例如将多个表中的行结合进一个Java类中。

  随着人们对JDBC的兴趣日益增涨,越来越多的开发人员一直在使用基于JDBC的工具,以使程序的编写更加容易。

程序员也一直在编写力图使最终用户对数据库的访问变得更为简单的应用程序。

例如应用程序可提供一个选择数据库任务的菜单。

任务被选定后,应用程序将给出提示及空白供填写执行选定任务所需的信息。

所需信息输入应用程序将自动调用所需的SQL命令。

在这样一种程序的协助下,即使用户根本不懂SQL的语法,也可以执行数据库任务。

编辑本段模式支持

  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数据库访问的标准。

编辑本段建立联接

  建议链接的五大步骤:

  1加载(注册)数据库

  2建立链接

  3执行SQL语句

  4处理结果集

  5关闭数据库

  教程:

JDBC入门作者:

MaydeneFisher翻译:

comer

  你需要做的第一事情是你与想要使用的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,包含在咖啡店所卖咖啡的必要的信息,包括咖啡名字,他们的价格,本星期卖了多少磅及迄今为止卖的数目。

  另外,我们应该指出的的是SQL语句的格式。

在CREATETABLE语句中,关键字采用大写字符,并且每个项目都另起一行。

SQL并没有此要求;仅仅是为了更容易阅读。

SQL标准是不区分关键词的大小写的,

  然而,引号里的内容是区分大小写的:

在名字"Washington"里"W"必须被大写,并且余下的字符必须是小写的。

  对于标识,不同的DBMS有不同的要求,例如,某些DBMSs要求那些列名及表名必须跟创建时的一样,有些则没有此要求。

为安全起见,我们全部使用大写标识如COFFEES、SUPPLIERS,因为我们是那样定义他们的。

  到止我们写了创建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的基础。

  创建JDBCStatements对象

  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,PRICEFROMCOFFEES

  查询的结果集将具有如下形式:

  COF_NAMEPRICE

  -----------------------

  Colombian7.99

  French_Roast8.99

  Espresso9.99

  Colombian_Decaf8.99

  French_Roast_Decaf9.99

  上面SELECT语句取得了所有咖啡的名字及价格。

而下面的SELECT语句限制那些每磅价格低于$9.00的咖啡才被选择。

  SELECTCOF_NAME,PRICE

  FROMCOFFEES

  WHEREPRICE<9.00

  结果集将具有如下形式:

  COF_NAMEPRICE

  --------------------

  Colombian7.99

  French_Roast8.99

  ColombianDecaf8.9

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2