Java的数据库编程(JDBC)技术

来源:互联网 发布:晨曦计价软件下载 编辑:程序博客网 时间:2024/05/16 11:33

Java的数据库编程(JDBC)技术

第一节 JDBC概述

为什么采用JDBC、JDBC基本程序结构、JDBC的缺点、JDBC的工作原理、JDBC的结构、数据库应用的模型、通过JDBC 实现对数据库的访问

第二节   创建与数据源的连接

JDBC驱动程序、连接的一般方法、Access的连接应用、SQL Server 2000的连接应用、MySQL的连接应用、Oracle的连接应用、DB2的连接应用、不同种类的数据库驱动程序配置

第三节   运用JDBC进行数据库操作

查询数据库的一些结构信息、查询数据库中的数据、使用宏语句、使用存储过程、处理大二进制字段

第四节   事务处理

为什么要处理事务、无事务的情况、事务处理的实例

第五节   游标操作

ResultSet对象、游标操作的实例分析、更新数据库、插入操作、删除操作、批量操作

 

第一节   JDBC概述


JDBC(Java DataBase Connectivity,Java 数据库连接技术)是Java访问数据库资源的标准,JDBC标准定义了一组Java API,允许我们写出SQL语句,然后交给数据库。

有了JDBC从而可以使Java程序员用Java语言来编写完整的数据库方面的应用程序。另外也可以操作保存在多种不同的数据库管理系统中的数据,而与数据库管理系统中数据存储格式无关。同时Java语言的与平台的无关性,不必在不同的系统平台下编写不同的数据库应用程序。


一、为什么采用JDBC


JDBC可以说是最老的企业Java规范之一,最早的起草日期要追溯到1996年,JDBC与微软开发的开放数据连接(Open Database Connectivity,ODBC)标准具有同样的功能,它提供一组通用的API,通过数据库特定的驱动程序来访问数据库。

如果没有JDBC或者ODBC,开发人员必须使用不同的一组API来访问不同的数据库,而利用JDBC或者ODBC,则只需要使用一组API,再加上数据库厂商提供的数据库驱动程序就可以了。所以,利用JDBC,我们就可以把同一个企业级Java应用移植到另一个数据库应用上。

JDBC设计的目的

1)ODBC:微软的ODBC是用C编写的,而且只适用于Windows平台,无法实现跨平台地操作数据库。

2)SQL语言:SQL尽管包含有数据定义、数据操作、数据管理等功能,但它并不是一个完整的编程语言,而且不支持流控制,需要与其它编程语言相配合使用。

3)JDBC的设计:由于Java语言具有健壮性、安全、易使用并自动下载到网络等方面的优点,因此如果采用Java语言来连接数据库,将能克服ODBC局限于某一系统平台的缺陷;将SQL语言与Java语言相互结合起来,可以实现连接不同数据库系统,即使用JDBC可以很容易地把SQL语句传送到任何关系型数据库中。

4)JDBC设计的目的:它是一种规范,设计出它的最主要的目的是让各个数据库开发商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但应用程序不变)。

JDBC的主要功能:

1)创建与数据库的连接;

2)发送SQL语句到任何关系型数据库中;

3)处理数据并查询结果。


二、JDBC基本程序结构


Try{
    //(1)加载连接数据库的驱动程序
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    //(2)创建与数据库的连接
    Connection con=DriverManager.getConnection("jdbc:odbc:DatabaseDSN","Login","Password");
    //(3)发送SQL语句到数据库中
    Statement stmt=con.createStatement();
    ResultSet rs=stmt.executeQuery("select * from DBTableName");
    //(4)处理数据并查询结果。
    while(rs.next()){
        String name=rs.getString("Name") ;            
        int age=rs.getInt("age");
        float wage=rs.getFloat("wage");
    }
    //(5)关闭
    rs.close();
    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());
}


三、JDBC的缺点


1)JDBC并不符合面向对象的要求,JDBC要求你明确地处理数据字段,并且将它们映射到关系数据库的表中。开发人员被迫与两种区别非常大的数据模型、语言和数据访问手段打交道:Java,以及SQL中的关系数据模型。

2)在开发中实现从关系数据模型到Java对象模型的映射非常复杂,以致于多数开发人员从不为数据定义对象模型,而是简单地编写过程化的Java代码来对底层的关系数据库中的数据表进行操纵。

3)最终结果是:开发人员根本不能从面向对象的开发中得到任何好处。


四、JDBC的工作原理

 
JDBC 工作原理结构

 Java的应用程序

 JDBC API接口

 JDBC 驱动程序管理器

 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)查询数据库:创建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();   

    stmt.close();

    con.close(); 


五、JDBC的结构


JDBC主要包含两部分:面向Java程序员的JDBC API及面向数据库厂商的JDBC Drive API。

1) 面向Java程序员的JDBC API:

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) 面向数据库厂商的JDBC Drive API:

(现在的数据库厂商除了提供API接口之外,有一些厂商还提供了DBMS端的缓冲)

数据库厂商必须提供相应的驱动程序并实现JDBC API所要求的基本接口(每个数据库系统厂商必须提供对DriveManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。


六、数据库应用的模型


1) 两层结构(C/S):

在此模型下,客户端的程序直接与数据库服务器相连接并发送SQL语句(但这时就需要在客户端安装被访问的数据库的JDBC驱动程序),DBMS服务器向客户返回相应的结果,客户程序负责对数据的格式化。

    client端       ODBC/JDBC       Server端(DBMS)
  
主要的缺点:受数据库厂商的限制,用户更换数据库时需要改写客户程序;受数据库版本的限制,数据库厂商一旦升级数据库,使用该数据库的客户程序需要重新编译和发布;对数据库的操作与处理都是在客户程序中实现,使客户程序在编程与设计时较为复杂。

2) 三(或多)层结构(B/S):

在此模型下,主要在客户端的程序与数据库服务器之间增加了一个中间服务器(可以采用C++或Java语言来编程实现),隔离客户端的程序与数据库服务器。客户端的程序(可以简单为通用的浏览器)与中间服务器进行通信,然后由中间服务器处理客户端程序的请求并管理与数据库服务器的连接。


七、通过JDBC 实现对数据库的访问


1)引用必要的包

import java.sql.*;   //它包含有操作数据库的各个类与接口  

2)加载连接数据库的驱动程序类 

为实现与特定的数据库相连接,JDBC必须加载相应的驱动程序类。这通常可以采用Class.forName()方法显式地加载一个驱动程序类,由驱动程序负责向DriverManager登记注册并在与数据库相连接时,DriverManager将使用此驱动程序。

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

注意:

1.该条语句直接加载了sun公司提供的JDBC-ODBC Bridge驱动程序类。

2.ODBC-JDBC桥方式,可以采用ODBC数据源名称来指定数据库文件 

    String url="jdbc:odbc:studlist";

也可以直接采用指定数据库文件的物理位置(可以绝对路径,也可以是相对路径)  

String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=d://stud.mdb";


第二节   创建与数据源的连接


一、JDBC驱动程序


一般来说,驱动程序是由数据库厂商提供的,目前JDBC驱动程序共有四种类型:

第一种   JDBC-ODBC桥加ODBC驱动程序

这是Sun公司最早实现的JDBC 驱动程序,当时主要目的在于快速推广JDBC,以便业界接纳这个标准。实际上这种驱动程序就是把JDBC API映射到ODBC API上。JDBC-ODBC 桥接方式利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBC driver 和JDBC-ODBC bridge两种驱动程序。

这种桥接方式最大的问题,是把Java不由自主的和Windows绑定在了一起,失去了Java跨平台的特点,这对于Java应用程序来说是不可接受的。另外Sun所提供的ODBC-JDBC桥不是多线程的,也就是说它不适合在需要并发执行的企业级应用中使用。所以就目前的使用上来看,这种形式的驱动程序已经很少使用了。

第二种   本地API

这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。

这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java 数据库客户方与数据库服务器方通信。例如:Oracle用SQLNet协议,DB2用IBM 的数据库协议。数据库厂商的特殊协议也应该被安装在客户机上。

第三种   JDBC网络纯Java驱动程序

在java的早期阶段,Applet非常流行的时候,需要用Applet直接访问数据库,然而Applet安全模式禁止它访问多个Web服务器上的数据库资源,为了解决这个问题,这个驱动程序就像Applet访问数据库的代理,目前这种形式的驱动程序已经很少用。

这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种

不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。

这种方式是纯Java driver。数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBC driver)与数据库通信。对Internet 和Intranet 用户而言这是一个理想的解决方案。Java driver 被自动的,以透明的方式随Applets自Web服务器而下载并安装在用户的计算机上。

第四种   本地协议纯Java驱动程序

这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。

这种方式也是纯Java driver。数据库厂商提供了特殊的JDBC协议使Java数据库客户与数据库服务器通信。然而,将把代理协议同数据库服务器通信改用数据库厂商的特殊JDBC driver。这对Intranet 应用是高效的,可是数据库厂商的协议可能不被防火墙支持,缺乏防火墙支持在Internet 应用中会存在潜在的安全隐患。

驱动程序的选择往往是比较难以定夺的事情,一般来说,第二种驱动程序具有多年使用的优势,而第四种驱动程序由于避开了本地代码存在的隐患,相对来说可能比较好,而且比较容易移植。

目前而言,Sybase、Informix、Sql Server都可以使用第四种驱动程序,而Oracle可以使用第二种驱动程序。现在Oracle公司也免费提供第四种类型的驱动程序,可以访问下面的网址:

http://technet.oracle.com/software/tech/java/sqlj_jdbc/sofrware_index.html

驱动程序的安装应该仔细阅读数据库厂商提供的资料,下面我们以最常用的几种数据库为例,讨论数据库驱动程序的配置问题。


二、连接的一般方法


String url="jdbc:odbc:DatabaseDSN"; 

Connection con=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.getCatalog()); //取得数据库的完整路径及文件名 

JDBC借用了url语法来确定全球的数据库(数据库URL类似于通用的URL),对由url所指定的数据源的表示格式为

    jdbc:<subprotocal>:[ database locator]

jdbc---指出要使用JDBC

subprotocal---定义驱动程序类型

database locator---提供网络数据库的位置和端口号(包括主机名、端口和数据库系统名等)    

jdbc:odbc://host.domain.com:port/databasefile   

主协议jdbc,驱动程序类型为odbc,它指明JDBC管理器如何访问数据库,该例指定为采用JDBC-ODBC桥接方式;其它为数据库的位置表示。  

不同厂商的数据库系统,主要差别在JDBC的驱动程序及数据库的url格式。

下面讨论一些具体的问题。


三、Access的连接应用


Access数据库是微软Office自带的数据库,在安全性、方便性、用户界面方面有良好的表现,但它只适合小量用户使用。

由于它本身就必须在Windows下使用,这里正好用它说明ODBC-JDBC桥的应用。

数据源名:FaqAccess

测试代码:

import java.sql.*;

public class AccessDemo {
    public static void main(String[] args) throws Exception {
  //FaqAccess指在ODBC上声明的数据库名字
  String url = "jdbc:odbc:FaqAccess";
  String query, subject, answer;
  Connection conn;              //建立连接类
  Statement statement;          //建立Sql语句执行类
  ResultSet resultSet = null;   //建立结果集类
  //告诉程序使用jdbc与odbc桥创建数据库联接
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  //使用DriverManager类的getConnection()方法建立联接,第一个字符参数定义用户名,第二个字符参数定义密码
  conn = DriverManager.getConnection(url, "", "");
  statement = conn.createStatement();    //创建sql语句执行类
  //获取数据的记录数
  query = "select count(*) as rowCount from faqs";
  //使用executeQuery()方法执行sql命令
  resultSet = statement.executeQuery(query);
  resultSet.next();     //移到数据库的下一条记录
  //如果记录为空,那么加入十条记录
  if (resultSet.getInt("rowCount")==0){
   for(int i = 1; i < 11; ++i){
   String sql="insert into faqs values(" + i + ", '问题" + i + "','答案" + i + "')";
   //使用executeUpdate()方法执行除查询之外的sql命令
   statement.executeUpdate(sql);
   }
  }
  //获得数据库的所有记录
  query = "select * from faqs";
  resultSet = statement.executeQuery(query);
  //使用next()方法游历数据库的每条记录
  while (resultSet.next()) {
   //使用getString()方法取得字段的内容
   subject = resultSet.getString("subject");
   answer = resultSet.getString("answer");
   System.out.print("问题内容 = " + subject);
   System.out.println(", 客案内容 = " + answer);
  }
  resultSet.close();     //关闭结果集
  statement.close();     //关闭sql语句执行类
  conn.close();          //关闭数据库联接类
 }
}


四、SQL Server 2000的连接应用


微软的SQL Server在中小型数据库项目上应用非常普遍,它的连接速度快,支持的用户多,安全性好,而且是可视化界面,所以在国内许多MIS系统上应用非常广泛。

微软的驱动程序有三个程序:

msbase.jar 

msutil.jar 

mssqlserver.jar

我们可以在C盘根目录下建立一个文件夹:JDBCSQLSERVER2000。把这三个文件拷贝过去。

在工作目录下构造文件setenv.cmd,

set path=%path%;c:/j2sdk1.4.0/bin;

set CLASSPATH=.;c:/j2sdk1.4.0/lib

set CLASSPATH=%CLASSPATH%.;c:/JDBCSQLSERVER2000/msbase.jar;c:/JDBCSQLSERVER2000/msutil.jar;c:/JDBCSQLSERVER2000/mssqlserver.jar

以设置CLASSPATH路径。

启动在运行前需要启动一下这个文件,设上路径。

注意:在UNIX操作系统中,路径设置为:

CLASSPATH=.;/home/user1/mssqlserver2000jdbc/lib/msbase.jar;/home/user1/mssqlserver2000jdbc/lib/msutil.jar;/home/user1/mssqlserver2000jdbc/lib/mssqlserver.jar

可以做一个小的例子,实验数据库调用情况:

文件名:SqlDemo.java

import java.*;
import java.lang.*;
import java.sql.*;

public class SqlDemo {
 public static void main(String[] args) throws Exception {       
  //声明连接,SQL语句执行对象和结果集变量
  java.sql.Connection conn = null;
  java.sql.Statement stmt  = null;
  java.sql.ResultSet rs    = null;
  //加载数据库驱动程序
  //Driver Classname=com.microsoft.jdbc.sqlserver.SQLServerDriver
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  //创建连接
  //url=jdbc:microsoft:sqlserver://COMMONOR-02A84C:1433
  //Properties
  //Password=
  //DatabaseName=pubs
  //User=sa
  //计算机名要根据实际情况更改
  conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://COMMONOR-02A84C:1433;DatabaseName=pubs;User=sa;Password=");
  //创建SQL语句对象
  stmt = conn.createStatement();
  //执行SQL语句
  stmt.execute("select * from employee");
  //取得结果集
  rs = stmt.getResultSet();
  //打印结果
  while (rs.next()) {
   System.out.println(rs.getString("fname") + " - " + rs.getString("lname")   + " - " + rs.getString("job_id"));
  }
  rs.close();          //关闭结果集   
  stmt.close();     //关闭sql语句执行类   
  conn.close();    //关闭数据库联接类 
    }
}

编译,运行,应该能够正常工作。