1、Java的数据库连接编程Java的数据库连接编程(JDBC)技术 本讲的知识要点:JDBC、JDBC的工作原理,访问数据库的方法、Statement、PreparedStatement、CallableStatement,ResultSet等对象的编程使用9.1 基本知识9.1.1 JDBC:Java DataBase Connectivity(Java 数据库连接技术),它是将Java与SQL结合且独立于特定的数据库系统的应用程序编程接口(API-它是一种可用于执行SQL语句的Java API,即由一组用Java语言编写的类与接口所组成)。 有了JDBC从而可以使Java程序员用Java语言
2、来编写完整的数据库方面的应用程序。另外也可以操作保存在多种不同的数据库管理系统中的数据,而与数据库管理系统中数据存储格式无关。同时Java语言的与平台的无关性,不必在不同的系统平台下编写不同的数据库应用程序。 9.1.2 JDBC设计的目的(1)ODBC:微软的ODBC是用C编写的,而且只适用于Windows平台,无法实现跨平台地操作数据库。(2)SQL语言:SQL尽管包含有数据定义、数据操作、数据管理等功能,但它并不是一个完整的编程语言,而且不支持流控制,需要与其它编程语言相配合使用。(3)JDBC的设计:由于Java语言具有健壮性、安全、易使用并自动下载到网络等方面的优点,因此如果采用Ja
3、va语言来连接数据库,将能克服ODBC局限于某一系统平台的缺陷;将SQL语言与Java语言相互结合起来,可以实现连接不同数据库系统,即使用JDBC可以很容易地把SQL语句传送到任何关系型数据库中。(4)JDBC设计的目的:它是一种规范,设计出它的最主要的目的是让各个数据库开发商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但应用程序不变)。9.1.3 JDBC的主要功能:(1)创建与数据库的连接;(2)发送SQL语句到任何关系型数据库中;(3)处理数据并查询结果。编程实例: try Class.forName(s
4、un.jdbc.odbc.JdbcOdbcDriver); /(1)创建与数据库的连接 Connection con=DriverManager.getConnection(jdbc:odbc:DatabaseDSN,Login,Password);Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery(select * from DBTableName);/(2)发送SQL语句到数据库中 while(rs.next() String name=rs.getString(Name) ; /(3)处理数据并查询结果
5、。 int age=rs.getInt(age); float wage=rs.getFloat(wage); rs.close(); /(4)关闭 stmt.close(); con.close(); catch(SQLException e) System.out.println(SQLState:+ e.getSQLState(); System.out.println(Message: + e.getMessage(); System.out.println(Vendor: + e.getErrorCode();9.1.4 JDBC与ODBC的对比,从而体会JDBC的特点(1)ODBC
6、是用C语言编写的,不是面向对象的;而JDBC是用Java编写的,是面向对象的。(2)ODBC难以学习,因为它把简单的功能与高级功能组合在一起,即便是简单的查询也会带有复杂的任选项;而JDBC的设计使得简单的事情用简单的做法来完成。(3)ODBC是局限于某一系统平台的,而JDBC提供Java与平台无关的解决方案。(4)但也可以通过Java来操作ODBC,这可以采用JDBc-ODBC桥接方式来实现(因为Java不能直接使用ODBC,即在Java中使用本地C的代码将带来安全缺陷)。9.1.5 JDBC驱动程序的类型: 目前比较常见的JDBC驱动程序可分为以下四个种类:(1)JDBC-ODBC桥加OD
7、BC驱动程序JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。JDBC-ODBC 桥接方式利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBC driver 和JDBC-ODBC bridge两种驱动程序。(2)本地API这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、
8、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java 数据库客户方与数据库服务器方通信。例如:Oracle用SQLNet协议,DB2用IBM 的数据库协议。数据库厂商的特殊协议也应该被安装在客户机上。(3)JDBC网络纯Java驱动程序这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这
9、是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。这种方式是纯Java driver。数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBC driver)与数据库通信。对Internet 和Intranet 用户而言这是一个理想的解决方案。Java driver
10、 被自动的,以透明的方式随Applets自Web服务器而下载并安装在用户的计算机上。(4)本地协议纯Java驱动程序这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。这种方式也是纯Java driver。数据库厂商提供了特殊的JDBC协议使Java数据库客户与数据库服务器通信。然而,将把代理协议同数据库服务器通信改用数据库厂商的特殊JDBC driver。这对Intranet 应用是高效的,可是数据库厂商的协议可能不被防火墙支持,缺乏防火墙支持在Internet 应用中会存在潜在的安全
11、隐患。9.2 JDBC的工作原理 JDBC的设计基于X/Open SQL CLI(调用级接口)这一模型。它通过定义出一组 API对象和方法以用于同数据库进行交互。在Java程序中要操作数据库,一般应该通过如下几步(利用JDBC访问数据库的编程步骤):(1)加载连接数据库的驱动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);(2)创建与数据源的连接 String url=jdbc:odbc:DatabaseDSN; Connection con=DriverManager.getConnection(url,Login,Password);(3)查询
12、数据库:创建Statement对象并执行SQL语句以返回一个ResultSet对象。 Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery(select * from DBTableName); (4)获得当前记录集中的某一记录的各个字段的值 String name=rs.getString(Name); int age=rs.getInt(age); float wage=rs.getFloat(wage);(5)关闭查询语句及与数据库的连接(注意关闭的顺序先rs再stmt最后为con) rs.close()
13、; stmt.close(); con.close(); 9.3 JDBC的结构 JDBC主要包含两部分:面向Java程序员的JDBC API及面向数据库厂商的JDBC Drive API。(1)面向Java程序员的JDBC API:Java程序员通过调用此API从而实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,它主要是由一系列的接口定义所构成。java.sql.DriveManager:该接口主要定义了用来处理装载驱动程序并且为创建新的数据库连接提供支持。java.sql.Connection:该接口主要定义了实现对某一种指定数据库连接的功能。java.sql.Stateme
14、nt:该接口主要定义了在一个给定的连接中作为SQL语句执行声明的容器以实现对数据库的操作。它主要包含有如下的两种子类型。 java.sql.PreparedStatement:该接口主要定义了用于执行带或不带 IN 参数的预编译 SQL 语句。 java.sql.CallableStatement:该接口主要定义了用于执行数据库的存储过程的雕用。java.sql.ResultSet:该接口主要定义了用于执行对数据库的操作所返回的结果集。(2)面向数据库厂商的JDBC Drive API:数据库厂商必须提供相应的驱动程序并实现JDBC API所要求的基本接口(每个数据库系统厂商必须提供对Driv
15、eManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。9.4 数据库应用的模型(1)两层结构(C/S):在此模型下,客户端的程序直接与数据库服务器相连接并发送SQL语句(但这时就需要在客户端安装被访问的数据库的JDBC驱动程序),DBMS服务器向客户返回相应的结果,客户程序负责对数据的格式化。client端 ODBC/JDBC Server端(DBMS)或数据库专用协议 主要的缺点:受数据库厂商的限制,用户更换数据库时需要改写客户程序;受数据库版本的限制,数据库厂商一旦升级数据库,使用该数
16、据库的客户程序需要重新编译和发布;对数据库的操作与处理都是在客户程序中实现,使客户程序在编程与设计时较为复杂。(2)三(或多)层结构(B/S):在此模型下,主要在客户端的程序与数据库服务器之间增加了一个中间服务器(可以采用C+或Java语言来编程实现),隔离客户端的程序与数据库服务器。客户端的程序(可以简单为通用的浏览器)与中间服务器进行通信,然后由中间服务器处理客户端程序的请求并管理与数据库服务器的连接。客户端程序 HTTP RMI CORBA 中间服务器 JDBC 数据库服务器9.5 通过JDBC 实现对数据库的访问(1)引用必要的包 import java.sql.*; /它包含有操作数
17、据库的各个类与接口 (2)加载连接数据库的驱动程序类 为实现与特定的数据库相连接,JDBC必须加载相应的驱动程序类。这通常可以采用Class.forName()方法显式地加载一个驱动程序类,由驱动程序负责向DriverManager登记注册并在与数据库相连接时,DriverManager将使用此驱动程序。 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);注意:这条语句直接加载了sun公司提供的JDBC-ODBC Bridge驱动程序类。(3)创建与数据源的连接 String url=jdbc:odbc:DatabaseDSN; Connection co
18、n=DriverManager.getConnection(url,Login,Password);注意:采用DriverManager类中的getConnection()方法实现与url所指定的数据源建立连接并返回一个Connection类的对象,以后对这个数据源的操作都是基于该Connection类对象;但对于Access等小型数据库,可以不用给出用户名与密码。 String url=jdbc:odbc:DatabaseDSN; Connection con=DriverManager.getConnection(url); System.out.println(con.getCatalo
19、g(); /取得数据库的完整路径及文件名 JDBC借用了url语法来确定全球的数据库(数据库URL类似于通用的URL),对由url所指定的数据源的表示格式为 jdbc: database locatorjdbc-指出要使用JDBCsubprotocal-定义驱动程序类型database locator-提供网络数据库的位置和端口号(包括主机名、端口和数据库系统名等) jdbc:odbc:/:port/databasefile 主协议jdbc 驱动程序类型为odbc,它指明JDBC管理器如何访问数据库,该例指名为采用JDBC-ODBC桥接方式;其它为数据库的位置表示。 例如:装载mySQL JD
20、BC驱动程序Class.forName(org.gjt.mm.mysql.Driver );String url =jdbc:mysql:/localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1 /testDB为你的数据库名 Connection conn= DriverManager.getConnection(url);例如:装载Oracle JDBC OCI驱动程序(用thin模式)Class.forName(oracle.jdbc.driver.OracleDriv
21、er );String url=jdbc:oracle:thin:localhost:1521:orcl; /orcl为你的数据库的SID String user=scott; String password=tiger; Connection conn= DriverManager.getConnection(url,user,password);注意:也可以通过con.setCatalog(MyDatabase)来加载数据库。例如:装载DB2驱动程序Class.forName(com.ibm.db2.jdbc.app.DB2Driver )String url=jdbc:db2:/loca
22、lhost:5000/sample; /sample为你的数据库名 String user=admin; String password=; Connection conn= DriverManager.getConnection(url,user,password); 例如:装载MicroSoft SQLServer驱动程序Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver );String url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=pubs; /pub
23、s为你的数据库的 String user=sa; String password=; Connection conn= DriverManager.getConnection(url,user,password);(4)查询数据库的一些结构信息 这主要是获得数据库中的各个表,各个列及数据类型和存储过程等各方面的信息。根据这些信息,从而可以访问一个未知结构的数据库。这主要是通过DatabaseMetaData类的对象来实现并调用其中的方法来获得数据库的详细信息(即数据库的基本信息,数据库中的各个表的情况,表中的各个列的信息及索引方面的信息)。 DatabaseMetaData dbms=con.
24、getMetaData(); System.out.println(数据库的驱动程序为 +dbms.getDriverName();(5)查询数据库中的数据: 在JDBC中查询数据库中的数据的执行方法可以分为三种类型,分别对应Statement (用于执行不带参数的简单SQL语句字符串),PreparedStatement(预编译SQL语句)和CallableStatement(主要用于执行存储过程)三个接口。9.5.1、实现对数据库的一般查询Statement 1、创建Statement对象(要想执行一个SQL查询语句,必须首先创建出Statement对象,它封装代表要执行的SQL语句)并执
25、行SQL语句以返回一个ResultSet对象,这可以通过Connection类中的createStatement()方法来实现。 Statement stmt=con.createStatement(); 2、执行一个SQL查询语句,以查询数据库中的数据。Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate() 和execute()。具体使用哪一个方法由SQL语句本身来决定。 方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句等。 方法 executeUpdate 用于执行INSERT、UPDATE或DE
26、LETE 语句以及SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。一般不会需要该高级功能。下面给出通过Statement类中的executeQuery()方法来实现的代码段。execute
27、Query()方法的输入参数是一个标准的SQL查询语句,其返回值是一个ResultSet类的对象。 ResultSet rs=stmt. executeQuery (select * from DBTableName); 要点:JDBC在编译时并不对将要执行的SQL查询语句作任何检查,只是将其作为一个String类对象,直到驱动程序执行SQL查询语句时才知道其是否正确。对于错误的SQL查询语句,在执行时将会产生 SQLException。 一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。 如果想对多个结果集同时操作,必须创建出多个Stat
28、ement对象,在每个Statement对象上执行SQL查询语句以获得相应的结果集。 如果不需要同时处理多个结果集,则可以在一个Statement对象上顺序执行多个SQL查询语句,对获得的结果集进行顺序操作。 import java.sql.*;public class ResultSetTest public static void main(String args) try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); Connection con=DriverManager.getConnection(jdbc:odbc:studlist);
29、Statement stmt=con.createStatement(); ResultSet rs1=stmt.executeQuery(select name from student); ResultSet rs2=stmt.executeQuery(select age from student);/此时rs1已经被关闭 while(rs2.next() System.out.println(rs2.getObject(1); rs2.close(); stmt.close(); con.close(); catch(Exception e) System.out.println(e)
30、; 注意:此时显示出的将是姓名还是年龄?(将显示的是rs2的结果集的内容,即学生的年龄,因为采用JDBC-ODBC方式的驱动程序时,并且是采用同一个Statement对象,它只会保留最新的结果集,rs1中的内容将会被新的结果集所取代)。 3、 关闭Statement对象:每一个Statement对象在使用完毕后,都应该关闭。 stmt.close(); 9.5.2、预编译方式执行SQL语句PreparedStatement 由于Statement对象在每次执行SQL语句时都将该语句传给数据库,如果需要多次执行同一条SQL语句时,这样将导致执行效率特别低,此时可以采用PreparedStatement对象来封装SQL语句。如果数据库支持预编译,它可以将SQL语句传给数据库作预编译,以后每次执行该SQL语句时,可以提高访问速度;但如果数据库不支持预编译,将在语句执行时才传给数据库,其效果类同于Statement对象。 另外PreparedStatement对象的SQL语句还可以接收参数,可以用不同的输入参数来多次执行编译过的语句,较Statement灵活方便(详见后文介绍)。1、 创建PreparedStatement对象:从一个Connection对象上可以创建一个PreparedStatement对象,在创建时可以给出预编译的SQL语句。 PreparedStatemen
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1