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类属于业务逻辑层,负责执行业务逻辑及访问数据库。