首页 > Java开发 > J2EE——JDBC解说

J2EE——JDBC解说

Java Data Base Connectivity (JDBC)

 

JDBC API以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样,JDBC为开发人员隐藏了不同数据库的不同特性。另外,由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。JDBC简而言之就是使用java访问数据库的接口,它为我们访问不同数据库提供了一个统一的形式。

JDBC4种不同的驱动程序分类:

类型 1: JDBC-ODBC Bridge

在JDBC出现的初期,JDBC-ODBC桥显然是非常有实用意义的,通过JDBC-ODBC桥,开发人员可以使用JDBC来存取ODBC数据源。不足的是,他需要在客户端安装ODBC驱动程序,换句话说,必须安装Microsoft Windows的某个版本。使用这一类型你需要牺牲JDBC的平台独立性。另外,ODBC驱动程序还需要具有客户端的控制权限。

类型 2: JDBC-native driver bridge

JDBC本地驱动程序桥提供了一种JDBC接口,它建立在本地数据库驱动程序的顶层,而不需要使用ODBC。 JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性,还要求在客户端安装一些本地代码。

类型 3: JDBC-network bridge

JDBC网络桥驱动程序不再需要客户端数据库驱动程序。它使用网络上的中间服务器来存取数据库。这种应用使得以下技术的实现有了可能,这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3种类型往往只需要相对更少的下载时间,具有平台独立性,而且不需要在客户端安装并取得控制权,所以很适合于Internet上的应用。

类型 4: Pure Java driver

第4种类型通过使用一个纯Java数据库驱动程序来执行数据库的直接访问。此类型实际上在客户端实现了2层结构。要在N-层结构中应用,一个更好的做法是编写一个EJB,让它包含存取代码并提供一个对客户端具有数据库独立性的服务。

WebLogic服务器为一些通常的数据库提供了JDBC驱动程序,包括Oracle, Sybase, Microsoft SQL Server以及Informix。它也带有一种JDBC驱动程序用于Cloudscape,这是一种纯Java的DBMS,WebLogic服务器中带有该数据库的评估版本。

JDBC规范详解

       所谓JDBC规范就是指在指定接口的情况下,各个数据库的开发商按照接口协议去实现对数据库的具体操作即我们常说的一些数据库驱动。JDBC规范的提出相当于将用户操作数据库的模型分为四个层次。第一个层次是指应用程序层即我们将要对数据库进行操作的应用程序。第二层为JDBC接口层,JDBC Driver Interface为用户访问、操作不同数据库提供了统一的接口。第三层为各数据库厂商根据JDBC规范开发的数据库驱动即对数据库操作具体实现的封装。而第四层则为最底层的数据库系统。
      
      如图所示,JDBC规范指的就是JDBC Driver Interface,而各个数据库开发商根据接口分别实现了各自的驱动(如Oracle JDBC Driver,SQL Server JDBC Driver,MySQL JDBC Driver)。、

JDBC的好处

        在没有JDBC规范之前,由于数据库的不同对数据库的操作自然也不相同,用户对不同的数据库操作都要写一份代码,这使访问数据库的难度大大增加。而JDBC规范提出之后,为用户操作不同数据库提供了统一的接口,使得用户只要按照JDBC规范编码即可实现写同一份代码,而修改某些配置就可以实现对不同数据库的操作,极大的方便了编程,也增强了程序的可移植性。

 使用JDBC访问数据库的步骤

1.    加载数据库驱动程序
2.     创建数据库连接
3.     执行SQL语句
4.     得到结果集
5.     对结果集做相应的处理(增,删,改,查)
6.     关闭资源:这里释放的是DB中的资源

       例:

[java]
  1. import java.sql.PreparedStatement;
  2. import java.sql.ResultSet;
  3. import java.sql.Statement;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.SQLException;
  7. public class Sqltest {
  8.     private Connection conn;
  9.     private Statement state;
  10.     private PreparedStatement prestate;
  11.     private String url;
  12.     private String username;
  13.     private String password;
  14.     private String driver;
  15.     private ResultSet result;
  16.     /**
  17.      * @param 服务器名
  18.      * @param 用户名
  19.      * @param 密码
  20.      * @param 驱动信息
  21.      */
  22.     public Sqltest( String url,String username, String password, String driver)
  23.     {
  24.         this.url=url;
  25.         this.username=username;
  26.         this.password=password;
  27.         this.driver=driver;
  28.     }
  29.    /**
  30.  * @return 返回连接
  31.  */
  32. public Connection getconn()
  33.    {
  34.        try {
  35.         Class.forName(driver);
  36.         conn= DriverManager.getConnection(url,username,password);
  37.     } catch (SQLException e) {
  38.         // TODO Auto-generated catch block
  39.         e.printStackTrace();
  40.     } catch (ClassNotFoundException e) {
  41.         // TODO Auto-generated catch block
  42.         e.printStackTrace();
  43.     }
  44.        return conn;
  45.    }
  46.   public ResultSet getStateResult(String sql)
  47.   {
  48.     try {
  49.         state= conn.createStatement();
  50.         result= state.executeQuery(sql);
  51.     } catch (SQLException e) {
  52.         // TODO Auto-generated catch block
  53.         e.printStackTrace();
  54.     }
  55.       return result;
  56.   }
  57.   public ResultSet getPrestateResults(String sql)
  58.   {
  59.       try {
  60.         prestate=conn.prepareStatement(sql);
  61.         result=prestate.executeQuery();
  62.     } catch (SQLException e) {
  63.         // TODO Auto-generated catch block
  64.         e.printStackTrace();
  65.     }
  66.       return result;
  67.   }
  68.   public static void main(String[] args)
  69.   {
  70.      Sqltest sqltest= new Sqltest("jdbc:sqlserver://localhost:1433;databasename=Restaurant;", "sa", "123456", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
  71.     Connection con= sqltest.getconn();
  72.     ResultSet res=  sqltest.getStateResult("select * from Foodinfo");
  73.    try {
  74.     while(res.next())
  75.     System.out.println(res.getString("name"));
  76. } catch (SQLException e) {
  77.     // TODO Auto-generated catch block
  78.     e.printStackTrace();
  79.     try {
  80.         res.close();
  81.     } catch (SQLException e1) {
  82.         // TODO Auto-generated catch block
  83.         e1.printStackTrace();
  84.     }
  85. }
  86.    finally{
  87.        try {
  88.         sqltest.state.close();
  89.         sqltest.getconn().close();
  90.     } catch (SQLException e) {
  91.         // TODO Auto-generated catch block
  92.         e.printStackTrace();
  93.     }
  94.    }
  95.   }
  96. }

总结

   由于各个数据库的底层实现是绝对机密,我们无法自己去写驱动,更何况没有那么大的精力(开发成本、维护成本、其他各项风险),而JDBC规范的提出使得我们不用自己去写驱动只需要相应的数据库厂商提供即可,极大方便了我们的编程。JDBC规范使应用程序的扩展性增强,遵循弱耦合的设计思想,增加了程序的可移植性和可扩展性。

本文固定链接: http://www.devba.com/index.php/archives/4993.html | 开发吧

报歉!评论已关闭.