JavaJDBCWord下载.docx
《JavaJDBCWord下载.docx》由会员分享,可在线阅读,更多相关《JavaJDBCWord下载.docx(19页珍藏版)》请在冰豆网上搜索。
Connectioncon=DriverManager.getConnection("
jdbc:
odbc:
DatabaseDSN"
"
Login"
Password"
Statementstmt=con.createStatement();
ResultSetrs=stmt.executeQuery("
select*fromDBTableName"
//
(2)发送SQL语句到数据库中
while(rs.next())
{Stringname=rs.getString("
Name"
);
//(3)处理数据并查询结果。
intage=rs.getInt("
age"
floatwage=rs.getFloat("
wage"
}
rs.close();
//(4)关闭
stmt.close();
con.close();
catch(SQLExceptione)
{System.out.println("
SQLState:
"
+e.getSQLState());
System.out.println("
Message:
+e.getMessage());
Vendor:
+e.getErrorCode());
}
9.1.4JDBC与ODBC的对比,从而体会JDBC的特点
(1)ODBC是用C语言编写的,不是面向对象的;
而JDBC是用Java编写的,是面向对象的。
(2)ODBC难以学习,因为它把简单的功能与高级功能组合在一起,即便是简单的查询也会带有复杂的任选项;
而JDBC的设计使得简单的事情用简单的做法来完成。
(3)ODBC是局限于某一系统平台的,而JDBC提供Java与平台无关的解决方案。
(4)但也可以通过Java来操作ODBC,这可以采用JDBc-ODBC桥接方式来实现(因为Java不能直接使用ODBC,即在Java中使用本地C的代码将带来安全缺陷)。
9.1.5JDBC驱动程序的类型:
目前比较常见的JDBC驱动程序可分为以下四个种类:
(1)JDBC-ODBC桥加ODBC驱动程序
JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。
注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。
因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
JDBC-ODBC桥接方式利用微软的开放数据库互连接口(ODBCAPI)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBCdriver和JDBC-ODBCbridge两种驱动程序。
(2)本地API
这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。
注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java数据库客户方与数据库服务器方通信。
例如:
Oracle用SQLNet协议,DB2用IBM的数据库协议。
数据库厂商的特殊协议也应该被安装在客户机上。
(3)JDBC网络纯Java驱动程序
这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。
这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。
所用的具体协议取决于提供者。
通常,这是最为灵活的JDBC驱动程序。
有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。
为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。
几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
这种方式是纯Javadriver。
数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBCdriver)与数据库通信。
对Internet和Intranet用户而言这是一个理想的解决方案。
Javadriver被自动的,以透明的方式随Applets自Web服务器而下载并安装在用户的计算机上。
(4)本地协议纯Java驱动程序
这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。
这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。
这种方式也是纯Javadriver。
数据库厂商提供了特殊的JDBC协议使Java数据库客户与数据库服务器通信。
然而,将把代理协议同数据库服务器通信改用数据库厂商的特殊JDBCdriver。
这对Intranet应用是高效的,可是数据库厂商的协议可能不被防火墙支持,缺乏防火墙支持在Internet应用中会存在潜在的安全隐患。
9.2JDBC的工作原理
JDBC的设计基于X/OpenSQLCLI(调用级接口)这一模型。
它通过定义出一组API对象和方法以用于同数据库进行交互。
在Java程序中要操作数据库,一般应该通过如下几步(利用JDBC访问数据库的编程步骤):
(1)加载连接数据库的驱动程序Class.forName("
(2)创建与数据源的连接
Stringurl="
;
Connectioncon=DriverManager.getConnection(url,"
(3)查询数据库:
创建Statement对象并执行SQL语句以返回一个ResultSet对象。
Statementstmt=con.createStatement();
(4)获得当前记录集中的某一记录的各个字段的值
Stringname=rs.getString("
(5)关闭查询语句及与数据库的连接(注意关闭的顺序先rs再stmt最后为con)
9.3JDBC的结构
JDBC主要包含两部分:
面向Java程序员的JDBCAPI及面向数据库厂商的JDBCDriveAPI。
(1)面向Java程序员的JDBCAPI:
Java程序员通过调用此API从而实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,它主要是由一系列的接口定义所构成。
java.sql.DriveManager:
该接口主要定义了用来处理装载驱动程序并且为创建新的数据库连接提供支持。
java.sql.Connection:
该接口主要定义了实现对某一种指定数据库连接的功能。
java.sql.Statement:
该接口主要定义了在一个给定的连接中作为SQL语句执行声明的容器以实现对数据库的操作。
它主要包含有如下的两种子类型。
java.sql.PreparedStatement:
该接口主要定义了用于执行带或不带IN参数的预编译SQL语句。
java.sql.CallableStatement:
该接口主要定义了用于执行数据库的存储过程的雕用。
java.sql.ResultSet:
该接口主要定义了用于执行对数据库的操作所返回的结果集。
(2)面向数据库厂商的JDBCDriveAPI:
数据库厂商必须提供相应的驱动程序并实现JDBCAPI所要求的基本接口(每个数据库系统厂商必须提供对DriveManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。
9.4数据库应用的模型
(1)两层结构(C/S):
在此模型下,客户端的程序直接与数据库服务器相连接并发送SQL语句(但这时就需要在客户端安装被访问的数据库的JDBC驱动程序),DBMS服务器向客户返回相应的结果,客户程序负责对数据的格式化。
client端ODBC/JDBCServer端(DBMS)
或数据库专用协议
主要的缺点:
受数据库厂商的限制,用户更换数据库时需要改写客户程序;
受数据库版本的限制,数据库厂商一旦升级数据库,使用该数据库的客户程序需要重新编译和发布;
对数据库的操作与处理都是在客户程序中实现,使客户程序在编程与设计时较为复杂。
(2)三(或多)层结构(B/S):
在此模型下,主要在客户端的程序与数据库服务器之间增加了一个中间服务器(可以采用C++或Java语言来编程实现),隔离客户端的程序与数据库服务器。
客户端的程序(可以简单为通用的浏览器)与中间服务器进行通信,然后由中间服务器处理客户端程序的请求并管理与数据库服务器的连接。
客户端程序HTTPRMICORBA中间服务器JDBC数据库服务器
9.5通过JDBC实现对数据库的访问
(1)引用必要的包
importjava.sql.*;
//它包含有操作数据库的各个类与接口
(2)加载连接数据库的驱动程序类
为实现与特定的数据库相连接,JDBC必须加载相应的驱动程序类。
这通常可以采用Class.forName()方法显式地加载一个驱动程序类,由驱动程序负责向DriverManager登记注册并在与数据库相连接时,DriverManager将使用此驱动程序。
Class.forName("
注意:
这条语句直接加载了sun公司提供的JDBC-ODBCBridge驱动程序类。
(3)创建与数据源的连接
采用DriverManager类中的getConnection()方法实现与url所指定的数据源建立连接并返回一个Connection类的对象,以后对这个数据源的操作都是基于该Connection类对象;
但对于Access等小型数据库,可以不用给出用户名与密码。
Connectioncon=DriverManager.getConnection(url);
System.out.println(con.getCatalog());
//取得数据库的完整路径及文件名
JDBC借用了url语法来确定全球的数据库(数据库URL类似于通用的URL),对由url所指定的数据源的表示格式为
jdbc:
<
subprotocal>
:
[databaselocator]
jdbc---指出要使用JDBC
subprotocal---定义驱动程序类型
databaselocator---提供网络数据库的位置和端口号(包括主机名、端口和数据库系统名等)jdbc:
//:
port/databasefile
主协议jdbc驱动程序类型为odbc,它指明JDBC管理器如何访问数据库,该例指名为采用JDBC-ODBC桥接方式;
其它为数据库的位置表示。
装载mySQLJDBC驱动程序
Class.forName("
org.gjt.mm.mysql.Driver"
Stringurl
="
mysql:
//localhost/softforum?
user=soft&
password=soft1234&
useUnicode=true&
characterEncoding=8859_1"
//testDB为你的数据库名
Connectionconn=DriverManager.getConnection(url);
装载OracleJDBCOCI驱动程序(用thin模式)
oracle.jdbc.driver.OracleDriver"
Stringurl="
oracle:
thin:
@localhost:
1521:
orcl"
//orcl为你的数据库的SID
Stringuser="
scott"
Stringpassword="
tiger"
Connectionconn=DriverManager.getConnection(url,user,password);
也可以通过con.setCatalog("
MyDatabase"
)来加载数据库。
装载DB2驱动程序
com.ibm.db2.jdbc.app.DB2Driver"
)
db2:
//localhost:
5000/sample"
//sample为你的数据库名
admin"
装载MicroSoftSQLServer驱动程序
com.microsoft.jdbc.sqlserver.SQLServerDriver"
microsoft:
sqlserver:
1433;
DatabaseName=pubs"
//pubs为你的数据库的
sa"
装载Informix驱动程序
com.informix.jdbc.IfxDriver"
).newInstance();
Stringurl="
informix-sqli:
//123.45.67.89:
1533/testDB:
INFORMIXSERVER=myserver;
user=testuser;
password=testpassword"
//testDB为数据库名
Connectionconn=DriverManager.getConnection(url);
装载Sybase驱动程序
com.sybase.jdbc.SybDriver"
Stringurl="
sybase:
Tds:
localhost:
5007/tsdata"
//tsdata为数据库名
PropertiessysProps=System.getProperties();
SysProps.put("
user"
userid"
password"
user_password"
Connectionconn=DriverManager.getConnection(url,SysProps);
(4)查询数据库的一些结构信息
这主要是获得数据库中的各个表,各个列及数据类型和存储过程等各方面的信息。
根据这些信息,从而可以访问一个未知结构的数据库。
这主要是通过DatabaseMetaData类的对象来实现并调用其中的方法来获得数据库的详细信息(即数据库的基本信息,数据库中的各个表的情况,表中的各个列的信息及索引方面的信息)。
DatabaseMetaDatadbms=con.getMetaData();
数据库的驱动程序为"
+dbms.getDriverName());
(5)查询数据库中的数据:
在JDBC中查询数据库中的数据的执行方法可以分为三种类型,分别对应Statement(用于执行不带参数的简单SQL语句字符串),PreparedStatement(预编译SQL语句)和CallableStatement(主要用于执行存储过程)三个接口。
9.5.1、实现对数据库的一般查询Statement
1、创建Statement对象(要想执行一个SQL查询语句,必须首先创建出Statement对象,它封装代表要执行的SQL语句)并执行SQL语句以返回一个ResultSet对象,这可以通过Connection类中的createStatement()方法来实现。
2、执行一个SQL查询语句,以查询数据库中的数据。
Statement接口提供了三种执行SQL语句的方法:
executeQuery()、executeUpdate()和execute()。
具体使用哪一个方法由SQL语句本身来决定。
●方法executeQuery用于产生单个结果集的语句,例如SELECT语句等。
●方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句,例如CREATETABLE和DROPTABLE。
INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。
executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。
对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零。
●方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。
一般不会需要该高级功能。
下面给出通过Statement类中的executeQuery()方法来实现的代码段。
executeQuery()方法的输入参数是一个标准的SQL查询语句,其返回值是一个ResultSet类的对象。
ResultSetrs=stmt.executeQuery("
要点:
①JDBC在编译时并不对将要执行的SQL查询语句作任何检查,只是将其作为一个String类对象,直到驱动程序执行SQL查询语句时才知道其是否正确。
对于错误的SQL查询语句,在执行时将会产生SQLException。
②一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。
③如果想对多个结果集同时操作,必须创建出多个Statement对象,在每个Statement对象上执行SQL查询语句以获得相应的结果集。
④如果不需要同时处理多个结果集,则可以在一个Statement对象上顺序执行多个SQL查询语句,对获得的结果集进行顺序操作。
importjava.sql.*;
publicclassResultSetTest
{publicstaticvoidmain(Stringargs[])
{try
{
Class.forName("
Connectioncon=DriverManager.getConnection("
studlist"
Statementstmt=con.createStatement();
ResultSetrs1=stmt.executeQuery("
selectnamefromstudent"
ResultSetrs2=stmt.executeQuery("
selectagefromstudent"
//此时rs1已经被关闭
while(rs2.next())
{
System.out.println(rs2.getObject
(1));
}
rs2.close();
stmt.close();
con.close();
}
catch(Exceptione)
{
System.out.println(e);
}