Hibernate逍遥游记
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 Java程序通过JDBC API访问数据库

Java程序使用的是Java语言,而关系数据库只懂SQL语言,要让使用不同语言的双方成功交流,就得请个翻译员了。这个翻译员就是JDBC(Java Database Connectivity,Java数据库连接器)驱动程序。如图1-7所示,JDBC驱动程序是连接Java程序和关系数据库的桥梁,只有通过它,Java程序才能与关系数据库通信。许多数据库服务器厂商为了让Java程序能够访问它们的数据库,都提供了相应的JDBC驱动程序。例如,从MySQL的官方网站(www.mysql.com)上就可以下载到MySQL的JDBC驱动程序类库。

图1-7 Java程序通过JDBC驱动程序与数据库服务器通信

从图1-7可以看出,有了JDBC驱动程序,Java程序就只需和JDBC驱动程序的API交互了。至于JDBC驱动程序如何与数据库服务器通信,取决于JDBC驱动程序的具体实现,Java程序无须了解它们的通信细节。JDBC API使用的是面向对象的Java语言,它为Java程序提供了用于访问数据库的接口和类,主要包括:

● DriverManager:代表驱动程序管理器,负责创建数据库连接。

● Connection:代表数据库连接。

● Statement:负责执行SQL语句。

● PreparedStatement:负责执行SQL语句,具有预定义SQL语句的功能。

● ResultSet:代表SQL查询语句的查询结果集。

图1-8显示了这些类的关系。

图1-8 JDBC API中主要类的类框图

悟空快速掌握了JDBC API中的主要接口和类的用法。在Java程序中,通过JDBC API访问数据库包含以下基本步骤。

(1)获得要访问的数据库的JDBC驱动程序的类库文件,把它放到classpath中。

(2)在程序中加载并注册JDBC驱动程序。例如,以下代码用于加载并注册MySQL驱动程序:

    //加载MySQL Driver类
    Class.forName("com.mysql.jdbc.Driver");
    //注册MySQL Driver
    java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver());

(3)建立与数据库的连接:

    Connection con = java.sql.DriverManager.getConnection
      (dburl,user,password);

getConnection()方法中有3个参数,dburl表示连接数据库的JDBC URL,user和password分别表示连接数据库的用户名和口令。

JDBC URL的一般形式为:

    jdbc:drivertype:driversubtype://parameters

drivertype表示驱动程序的类型。driversubtype是可选的参数,表示驱动程序的子类型。parameters通常用来设定数据库服务器的IP地址、端口号和数据库的名称。对于MySQL数据库连接,JDBC URL采用如下形式:

    jdbc:mysql://localhost:3306/SAMPLEDB

(4)创建Statement对象,准备执行SQL语句:

    Statement stmt = con.createStatement();

(5)执行SQL语句:

    String sql="insert into MONKEYS(ID,NAME,AGE,GENDER) "
                +"values(1,'智多星',1,'M')";
    stmt.executeUpdate(sql);  //执行SQL语句

(6)依次关闭Statement和Connection对象:

    stmt.close();
    con.close();

悟空编写的BusinessService类的源代码参见例程1-2。

例程1-2通过JDBC API来访问数据库的BusinessService.java

    package mypack;
    import java.io.*;
    import java.util.*;
    import java.sql.*;
    public class BusinessService{
            private String dbUrl="jdbc:mysql://localhost:3306/SAMPLEDB";
            private String dbUser="root";
            private String dbPwd="1234";
            static{
              try{
          Class.forName("com.mysql.jdbc.Driver");
          DriverManager.registerDriver(new com.mysql.jdbc.Driver());
              }catch(Exception e){throw new RuntimeException(e);}
            }
            /** 持久化一个Monkey对象 */
            public void saveMonkey(Monkey monkey){
              Connection con=null;
              try {
          //建立数据库连接
          con = java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);
          //创建一个SQL声明
          Statement stmt = con.createStatement();
          //向MONKEYS表插入记录
          stmt.executeUpdate("insert into MONKEYS(NAME,AGE,GENDER)
              values( "
              +"'"+monkey.getName()+"',"
              +monkey.getAge()+","
              +"'"+monkey.getGender()+"')");
          stmt.close();
              }catch(Exception e) {
          throw new  RuntimeException(e);
              } finally {
          try{
            if(con! =null)con.close();
          }catch(Exception e){e.printStackTrace(); }
        }
      }
      }

由于JDBC API的用法不是本书介绍的重点,因此不对BusinessService类的代码做详细介绍。

再次运行MonkeyGui类,MonkeyGui类就可以通过BusinessService类的saveMonkey()方法来保存猴子信息了。参见图1-9。

图1-9 MonkeyGui类通过BusinessService类来保存猴子信息

在图1-9中,Java程序针对数据库服务器而言,它是数据库服务器的客户程序。而Java程序本身还可以分为客户层和业务逻辑层。在本例中,MonkeyGui类属于客户层,提供图形用户界面;而BusinessService类属于业务逻辑层,负责执行业务逻辑及访问数据库。