第14章 JDBC技术和数据库开发应用
教学目标 JDBC技术 创建SQL Server服务器上的数据库 Java应用程序通过JDBC存取数据库的过程 JDBC的体系结构 JDBC API的主要类和接口简介 创建SQL Server服务器上的数据库 SQL Server的组件简单介绍 创建用户数据库study和ODBC数据源 创建ODBC数据源 Java应用程序通过JDBC存取数据库的过程 应用JDBC存取数据库的步骤 JDBC存取SQL Server数据库的简单实例
教学目标(续) JDBC中的主要接口和类 DriverManager类 Connection接口 Statement接口 PreparedStatement接口 CallableStatement 接口 Java数据类型和SQL中支持的数据类型的对应关系 ResultSet接口 ResultSetMetaData接口 DatabaseMetaData接口 数据库开发应用实例 Study数据库的插入、修改、删除记录的程序设计 查询Study数据库的程序设计
14.1 JDBC技术 Java程序使用JDBC(Java Database Connectivity) API与数据库进行通信
14.1.1 JDBC的体系结构 图13-1 JDBC的体系结构 Java应用程序 JDBC API JDBC Driver Manager 数据库驱动器 数据库 图13-1 JDBC的体系结构
14.1.2 JDBC驱动程序类型 1.JDBC-ODBC bridge plus ODBC driver(类型1):JDBC-ODBC桥接驱动程序。其底层通过ODBC(Open databas Connectivity)驱动程序来连接数据库。 2. Native-API partly-Java driver(类型2):本地 API - 部份用 Java 来编写的驱动程序。此种方式先将JDBC函数调用转换成数据库客户端函数库的API(位于客户端计算机),然后与数据库相连。 3.JDBC-Net pure Java driver(类型3):JDBC 网络纯 Java 驱动程序。首先JDBC驱动程序会将JDBC函数调用解释成与数据库无关的网络通信协议,经过中介服务器的第二次解析,最后才转换成相对应的数据库通信协议. 4.Native-protocol pure Java driver(类型4) 本地协议纯 Java驱动程序。这种驱动程序将 JDBC 调用直接转换为 DBMS 所使用的网络协议。
14.1.3 JDBC API的主要类和接口简介 JDBC API由一系列与数据库访问有关的类和接口组成,它们放在java.sql子包中。其中主要的类和接口有: DriverManager类: Connection接口 Statement接口、 与子类PreparedStatement、CallableStatement; ResultSet; CallableStatement接口
14.2 创建SQL Server服务器上的数据库 SQL Server 2000数据库逐渐成为Windows操作系统平台下进行数据库应用开发中较为理想的选择之一,它可作为大型Web站点、企业OLTP(联机事务处理)以及数据仓库系统等的产品数据库服务器。
14.2.1 SQL Server的组件简单介绍 SQL Server 2000 提供了一整套的管理工具和实用程序,使用这些工具和程序,可以设置和管理SQL Server 进行数据库管理和备份,并保证数据的安全和一致。 1. 企业管理器(Enterprise Manager) 2. 查询分析器(Query Analyzer) 。
企业管理器主界面
查询分析器的界面
创建用户数据库study和ODBC数据源 SQL Server服务器上存放着一组系统数据库和用户数据库。 用户数据库Study是我们本章要用的数据库,存放着学生的基本信息、课程情况和学生学习各门课程的学习成绩。Study数据库中有学生情况表student、课程情况表course和学习成绩表sc。 student由学号、姓名、性别、年龄和所在系各字段组成; course由课程号、课程名和学分各字段组成; sc由学号、课程号和学习成绩各字段组成。
1. 在Microsoft SQL Server服务器上创建数据库study 进入查询分析器(Query Analyzer),通过运行下面的脚本文件study.sql ,完成创建数据库study和三张表student、course和sc (见本书配套光盘脚本文件)。
2. 创建ODBC数据源 用window控制面板中数据源“ODBC”管理器,创建一个连接到SQL Server的数据源 数据源名称为studyDSN, 连接的数据库是study,用户为sa,口令为sa。此数据源名studyDSN在第13章、第14章中的例子中使用。
14.3 Java应用程序通过JDBC存取数据库的过程 然后通过一个简单实例演示整个过程。
14.3.1 应用JDBC存取数据库的步骤 Java应用程序通过JDBC存取数据库时应该遵循五个步骤: 2. 建立数据库连接 3. 建立与执行SQL语句 4. 处理结果集 5. 关闭数据库连接
1. 加载( 注册)JDBC驱动程序 加载JDBC驱动程序通常有下列两种方法: (1) 使用Class.forName() 语法: 例如:加载jdbc-odbc驱动程序的语句: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
1. 加载( 注册)JDBC驱动程序(续) 加载Microsoft Sql server的驱动程序的语句: Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 加载Ooracle的驱动程序的语句: Class.forName("oracle.jdbc.driver.OracleDriver"); 加载MySQL驱动程序的语句: Class.forName("com.mysql.jdbc.Driver");
2. 建立数据库连接 使用DriverManger.getConnection(),建立一个新的数据库连接。方法: Connnetion getConnection(String URL); 返回连接到特定数据库的Connnetion对象。参数String用来定义JDBC URL。 。
2. 建立数据库连接(续) 例14-1 通过已经建立了ODBC的数据源StudyDSN连接数据库。 try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");} catch (ClassNotFoundException e) { e.printStackTrace(); } try { String url ="jdbc:odbc:studyDSN"; String login = "sa"; String password ="sa"; Connection conn = DriverManager.getConnection(url,login,password); catch ( SQLException sqlException ) { e.printStackTrace();//输出捕获到的异常信息
2. 建立数据库连接(续) 例14-2 通过JDBC-ODBC驱动程序连接SQL Server 2005或SQL Server 2008 express版本。但不必事先建立ODBC的数据源。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String connURL = "jdbc:odbc:Driver={SQLServer};Server=machineName“ +"\\"+"SQLEXPRESS;Database=study;uid=sa;pwd=sa "; Connection conn = DriverManager.getConnection(connURL);
2. 建立数据库连接(续) 通过JDBC-ODBC驱动程序连接access。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String connURL = "jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=c:/data/test.mdb"; Connection conn = DriverManager.getConnection(connURL);
2. 建立数据库连接(续) 例14-3 从网站下载SQL Server 2005或SQL Server 2008的sqljdbc_2.0驱动程序包sqljdbc4.jar,并将此包放在用户应用能访问的类路径中。 String url = "jdbc:sqlserver://localhost:1030;DatabaseName=study"; String user = "sa", pwd = "sa"; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn=DriverManager.getConnection(url,user,password);
2. 建立数据库连接(续) 例14-4 从网站下载Oracle驱动程序包classes12.zip,并将此包的路径放在classpath环境变量中 Class.forName("oracle.jdbc.driver.OracleDriver"); String url = " jdbc:oracle:thin:@192.168.0.20:1521: ORCL"; conn=DriverManager.getConnection(url,user,password);
3.建立SQL语句对象,执行查询 建立新数据库连接以后,必须先建立一个Statement对象才能执行SQL语句。在Java中,定义了三种类型的Statememt,它们是Statement、PreparedStatement和CallableStatement。三种均包含用于进行数据库操作的SQL语句。 (1)使用Statement。示例如下: Statement Stmt =conn.createStatement(); String sqlQuery=“select * from Employee”; ResultSet rs= Stmt.executeQuery(sqlQuery);
3.建立SQL语句对象,执行查询(续) (2)使用PreparedStatement 用于处理预编译的SQL语句,可重复执行。 PreparedStatement prepStmt = conn.prepareStatement ("SELECT * FROM Employee "); ResultSet rset=prepStmt.executeQuery(); 利用WHERE来限制SELECT语句的查询结果: PreparedStatement prepStmt=conn.prepareStatement ("SELECT * FROM Employee WHERE ename=? ") prepStmt.setString(1,"SCOTT"); ResultSet rset = prepStmt.executeQuery();
3.建立SQL语句对象,执行查询(续) 执行带2个参数的UPDATE语句,示例如下: PreparedStatement prepStmt= conn.prepareStatement ("UPDATE emp SET sal = ? WHERE ename = ? "); prepStmt.setInt(1,100000); prepStmt.setString(2,"Rich"); prepStmt.executeUpdate();
3.建立SQL语句对象,执行查询(续) (3) 使用CallableStatement用来调用数据库存储过程 语法: CallableStatement 变量名= conn.prepareCall(call 存储过程名称); 示例: CallableStatement callStmt= conn.prepareCall("{call update_salary(?,?)}"); callStmt.setInt(1,7788); //设置要传入的第一个输入参数(?)值是7788 callStmt.setInt(2,10000); //设置要传入的第二个输入参数(?)值是10000 callStmt.execute();
3.建立SQL语句对象,执行查询(续) 建立Statement对象或PreparedStatement对象或CallableStatement之后,有3种方法执行SQL语句: executeQuery(): 执行select的SQL查询语句 executeUpdate():执行insert、delete、update 更新语句,以及DDL语句。 execute():执行SQL查询语句。
3.建立SQL语句对象,执行查询(续) //SQL查询语句 ResultSet rset=stmt.executeQuery(SELECT * FROM emp); // update语句 stmt.executeUpdate("update emp set age=sge+1"); // delete语句 stmt.executeUpdate("delete emp for age=20"); //DDL语句 stmt.execute ("CREATE TABLE table“ +"(no CHAR(10),name CHAR(10))");
4. 处理结果集 可用while循环打印出ResultSet记录集内所有记录。 while(rs.next()){ System.out.println(rs.getInt(1)); System.out.println(rs.getString(2)); } 1、2、3、…表示各字段相对位置
5. 关闭数据库连接 通过JDBC存取数据库时最后一个操作是关闭Connection、Statement、ResultSet等对象. rs.close(); stmt.close(); con.close();
14.3.2 JDBC存取SQL Server数据库的简单实例 例14-5 编写通过JDBC存取study数据库中的表course的Java程序。 本例利用前面13.2节创建好的"ODBC"数据源,名称为studyDSN,存取study数据库
ResultSet rs= statement.executeQuery(sqlQuery); //jdbcExample1.java import java.sql.*; import javax.swing.*; class jdbcExample1 { public static void main(String args[]) { try { //加载JDBC驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // String url ="jdbc:odbc:studyDSN"; String login = "sa"; String password =""; //通过数据源连接 Connection conn = DriverManager.getConnection(url,login,password); //建立SQL语句对象 Statement statement =conn.createStatement(); String sqlQuery="select * from course"; //执行查询 ResultSet rs= statement.executeQuery(sqlQuery); while(rs.next()){ //处理结果集 System.out.print(rs.getString(1)+","); System.out.print(rs.getString(2)+","); System.out.print(rs.getInt(3)+","); }
catch ( SQLException sqlException ) { //关闭数据库连接 statement.close(); conn.close(); } //捕获异常 catch ( SQLException sqlException ) { JOptionPane.showMessageDialog( null, sqlException.getMessage(), "Database Error", JOptionPane.ERROR_MESSAGE ); System.exit( 1 ); // detect problems loading database driver catch ( ClassNotFoundException classNotFound ) { JOptionPane.showMessageDialog ( null, classNotFound.getMessage(), "Driver Not Found", JOptionPane.ERROR_MESSAGE ); } //end of main } //end of class c1 , 数据库, 4 c2 , 数学, 2.5 c3 , 信息系统, 4 c4 , 英语, 3
14.4 JDBC中的主要接口和类 Java应用程序访问数据库主要是通过JDBC API实现的,通过下面几个重要接口和类: DriverManager类 Connection接口 Statement接口 PreparedStatement接口 CallableStatement接口 ResultSet接口 ResultSetMetaData接口 DatabaseMetaData接口 Java的基本数据类型和SQL中支持的数据类型对应关系。
14.4.1 DriverManager类 DriverManager类是Java.sql包中用于数据库驱动程序管理的类,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接,也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。 DriverManager 类直接继承自java.lang.object,其主要成员方法(请参见本书)
14.4.2 Connection接口 Connection接口是用来表示数据库连接的对象,对数据库的一切操作都是在这个连接的基础上进行的。Connection接口的主要成员方法(请参见本书)
14.4.3 Statement接口 Statement接口用于在已经建立的连接的基础上向数据库发送SQL语句的对象。它只是一个接口的定义,其中包括了执行SQL语句和获取返回结果的方法。 有3种 Statement 对象:Statement、PreparedStatement(继承自Statement )和 CallableStatement(继承自PreparedStatement)。它们都作为在给定连接上执行 SQL 语句的容器,每个都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。
14.4.3 Statement接口 创建statement对象的方法如下: Statement stmt = con.createStatement(); Statement接口定义中包括的主要方法(请参见本书)
14.4.4 PreparedStatement接口 PreparedStatement接口和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令需多次执行时,用PreparedStatement会比Statement效率更高。 PreparedStatement接口的主要方法(请参见本书)
14.4.5 CallableStatement 接口 CallableStatement接口用于执行对数据库已存储过程的调用。在CallableStatement对象中,有一个通用的成员方法call,这个方法以名称的方式调用数据库中的存储过程。在数据库调用过程中,可以通过设置IN参数向调用的存储过程提供执行所需的参数。另外,在存储过程的调用中,通过OUT参数获取存储过程的执行结果。 CallableStatement 接口的主要成员方法 (请参见本书)
14.4.5 CallableStatement 接口(续) 例14-6 利用JDBC接口调用数据库的存储过程Query_Student。 存储过程Query_Studen.sql的脚本如下: USE study GO CREATE PROCEDURE Query_Study2 ( @no char(6), @name char(20) OUTPUT, @dept char(10) OUTPUT ) AS SELECT @name=sname,@dept=sdept FROM student WHERE sno=@no
14.4.5 CallableStatement 接口(续) JdbcCallProcedure.java的代码 import java.sql.*; import javax.swing.*; class jdbcCallProcedure { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String DATABASE_URL = "jdbc:odbc:Driver={SQL Server};Server=ZGZ1"+"\\"+ "SQLEXPRESS;uid=sa;pwd=sa;Database=study"; Connection conn = DriverManager.getConnection(DATABASE_URL);
CallableStatement callStmt= conn.prepareCall("{call Query_Student(?,?,?)}"); callStmt.setString(1,"20001"); //设置传入的第一个输入参数(?)值是20001 callStmt.registerOutParameter(2,java.sql.Types.VARCHAR) callStmt.registerOutParameter(3,java.sql.Types.VARCHAR); callStmt.execute(); String b1=callStmt.getString(2); String b2=callStmt.getString(3); System.out.println(b1); System.out.println(b2); callStmt.close(); conn.close(); } catch ( SQLException sqlException ) { ….
14.4.6 Java数据类型和SQL中支持的数据类型的对应关系
14.4.7 ResultSet接口 ResultSet接口负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作;也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。 ResultSet接口主要方法(请参见本书)
14.4.8 ResultSetMetaData接口 ResultSetMetaData接口的对象保存了所有ResultSet类对象中关于字段的元信息,并提供许多方法来取得这些信息。 ResultSetMetaData接口中的方法(请参见本书)
14.4.9 DatabaseMetaData接口 DatabaseMetaData接口保存了数据库的所有特性,并且提供许多方法来取得这些信息。 DatabaseMetaData类的主要方法(请参见本书)
14.5数据库开发应用实例 本节利用前面建立的SQL Server的数据库Study和ODBC数据源StudyDSN,安排了对数据库进行插入、修改、删除和查询的Java程序设计。这些程序设计实例在设计时,考虑了通用性原则,应用了通用性的程序设计技术。其好处是:你可以利用本节示范的程序设计例子很容易编写访问其它数据库的Java应用程序。
14.5.1 Study数据库的插入、修改、删除记录的程序设计 对Study数据库中的表Student完成输入、修改、删除的Java程序。这三个程序有相似的GUI,因此声明类StudentUI以封装该GUI。 例13-2 对Study数据库中的表Student完成增加记录的程序设计。 程序由两个类AddStudentFrame和StudentUI组成。 将 StudentUI类放在子包UI中; 在类AddStudentFrame中,用语句import UI.StudentUI;导入子包中类StudentUI。
类StudentUI设计思路 类StudentUI完成输入记录的画面设计,其设计思路如下: (1) 调用者利用StudentUI类构造方法的参数(字符型数组String arrayString[]),传递输入记录画面上一组列的标题。 在StudentUI类构造方法中, 从数组arrayString的实例变量arrayString.length中可得到列的个数,并取出列的标题放在labels数组。 (2) 定义一组文本字段fields[]用于编辑一张表的记录各字段,并且调用者通过方法getFields()和setFields()可读取和设置fields值。 (3) 类StudentUI界面上提供两个通用Button按钮doTask1、 doTask2,按钮的标签内容和按钮的事件处理过程,可通过调用者来设置。 类StudentUI的程序代码
类AddStudentFrame设计思路 类AddStudentFrame是一个Frame, 在此类中创建StudentUI的对象并将它添加到Frame。 在创建StudentUI对象时,调用构造方法,将要显示的记录的一组列标题,传递给StudentUI对象; 并从StudentUI对象中得到用户输入的记录的各字段值; 两个通用按钮的内容和事件处理代码在此类中也得到设置。类AddStudentFrame的代码
例14-7 对Study数据库中的表Student完成增加记录的程序执行结果
14.5.1 Study数据库的插入、修改、删除记录的程序设计(续) 例14-8 对Study数据库中的表Student完成修改记录的程序设计。 程序根据用户输入的要修改的学号值,定位并修改表student 中的记录。若数据库中对应的记录不存在,则显示无此记录的提示。程序代码如下: UpdateStudentFrame.java的代码
例14-8 对Study数据库中的表Student完成修改记录的程序执行结果
14.5.1 Study数据库的插入、修改、删除记录的程序设计(续) 例14-9 对Study数据库中的表Student完成删除记录的程序设计。 程序根据用户输入的要删除的学号值,定位并删除表student 中的记录。若数据库中对应的记录不存在,则显示无此记录的提示。程序代码如下: DeleteStudentFrame.java
例14-9 对Study数据库中的表Student完成删除记录的程序执行结果
14.5.2 查询Study数据库的程序设计 例14-10 对Study数据库完成查询记录的程序设计。 该程序利用Java的GUI组件JtextArea(多行文本编辑域),显示从数据库查询得到的student表的记录集合。此程序在类DisplayStudents(从Frame继承)中建立数据库连接,定义要执行的SQL语句字符串,执行SQL语句得到查询结果集对象resultSet。利用语句: ResultSetMetaData metaData = resultSet.getMetaData(); 取得查询结果集的元数据ResultSetMetaData的对象metaData。调用metaData对象的方法getColumnCount()取得结果集中列的个数,调用getColumnName( i ) 取得结果集中的第i列的名称。
14.5.2 查询Study数据库的程序设计(续) 接着执行循环语句: while ( resultSet.next() ) { for ( int i = 1; i <= numberOfColumns; i++ ) results.append( resultSet.getObject( i ) + "\t" ); results.append( "\n" ); } 循环执行之前结果集的指针开始定位在第一条记录之前,next()方法向下移动一条记录。方法getObject( i )读取第i条记录添加到文本编辑域变量results中。此过程不断重复,直到结果集的指针定位到表的最后一条记录之后的位置或文件尾(即next()返回值为假)为止。最后在Frame中显示文本编辑域变量results的值。
14.5.2 查询Study数据库的程序设计(续) 注意:此程序在设计时,考虑了程序的通用性:即通过修改此程序中定义中ODBC数据库源名称和要执行的SQL语句字符串,此程序可对任何数据库中的表进行查询操作。 类DisplayStudents的代码
例14-10 对Study数据库完成查询记录的程序执行结果
14.5.2 查询Study数据库的程序设计(续) 例14-11 以表格格式显示数据库的查询结果的程序设计。 此程序运行时,用户能自定义要查询的SQL语句,包括单表查询、多表查询,有条件的查询、无条件的查询,以及对表的统计查询。运行的结果以二维表格的形式表现。 为了在用户界面上以二维表格形式表现查询结果,可以利用JTable表格类和AbstractTableModel表格模型类。 用JTable类以二维表的形式显示,数据表格中的数据从表格模型 AbstractTableModel类的对象中获取。下面先介绍这两个类。
1.类JTable JTable组件属于javax.swing包,它能以二维表的形式显示数据。类JTable在显示数据时具有以下特点: (1)可定制性:可以定制数据的显示方式和编辑状态; (2)异构性:可以显示不同类型的数据对象,甚至包括颜色、图标等复杂对象; (3)简便性:可以以缺省方式轻松地建立起一个二维表。 使用类JTable显示数据之前,必须根据情况先生成定制的表格模型、单元绘制器或单元编辑器。类AbstractListModel用来定制用户自己的表格模型。 创建JTable的表格对象时,将捆绑定制的表格模型。例如: JTable table = new JTable(dataModel); //dataModel是定制的表格模型对象 JScrollPane scrollpane = new JScrollPane(table); //将表格添加到可滚动的面板
2. 类AbstractTableModel 类AbstractTableModel,提供了TableModel接口中绝大多数方法的缺省实现。类AbstractTableModel隶属于javax.swing.table。该类是一个抽象类,没有完全实现,不能实例化,使用时必须在程序中实现方法。 要想生成一个具体的TableModel作为AbstractTableMode的子类,至少必须实现下面以下三个方法: public int getRowCount(); //得到表格的行数 public int getColumnCount(); //得到表格的行数 public Object getValueAt(int row, int column); //得到表格的第row行、第column列的单元值
2. 类AbstractTableModel (续) 例如,我们可以建立一个简单二维表(10×10),实现方法如下: TableModel dataModel = new AbstractTableModel() { //定制自己的表格模型 public int getColumnCount() { return 10; } public int getRowCount() { return 10;} public Object getValueAt(int row, int col) { return new Integer(row*col); } }; JTable table = new JTable(dataModel);//捆绑定制的表格模型 JScrollPane scrollpane = new JScrollPane(table); //将表格添加到可滚动的面板
例14-11 以表格格式显示数据库的查询结果的程序设计的思路 在例14-10中,为了实现在表格中显示数据库的查询结果,用一个TableModel对象把ResultSet数据提供给JTable,在JTable中显示查询结果。 ResultSetTableModel类执行与数据库的连接和生成ResultSet对象。 DispalyQueryResults类创建GUI,并建立JTable的对象,并从ResultStTableModel的对象中获得数据。
例14-11 以表格格式显示数据库的查询结果的程序设计的思路(续) ResultStTableModel类的构造方法接收三个参数:数据库驱动程序列的名称、数据库的URL、和要执行的查询SQL语句的字符串。类中使用的createStatement方法如下: statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); 其版本带有两个参数:结果集类型和结果集的并发性。结果集类型规定ResultSet的游标移动的方向以及Result是否对变化敏感。结果集的并发性规定是否能用ResultSet的更新方法更新ResultSet。上面语句规定了一个游标可沿两个方向滚动的、对变化敏感的和只读的ResultSet。
例14-11 以表格格式显示数据库的查询结果的程序设计的思路(续) ResultStTableModel类是AbstractTableModel类的子类,在此类中重写了TableModel 的方法有getColumnCount()、getRowCount()、getValueAt和getColumnName(得到列名)、getColumnClass(得到列名的类)、getValueAt(得到表格中单元格的值),而TableModel的方法isCellEditable和setValueAt()的默认实现没有被重写,因而本例不支持JTable单元的编辑。
例14-11 以表格格式显示数据库的查询结果的程序设计的思路(续) ResultStTableModel类的方法setQuery执行查询SQL语句,并调用方法fireTableStructureChanged(从AbstractTableModel类继承),通知任何以对象ResultStTableModel为表格模型的JTable,模型的结构已经发生变化,通知JTable用新的ResultSet数据重新填充JTable的行和列。SetQuery方法中抛出的任何异常被传递给调用者。 ResultStTableModel类的定义代码如下:
例14-11 以表格格式显示数据库的查询结果的程序设计的思路(续) DispalyQueryResults类负责创建GUI;建立数据库驱动程序列的名称、数据库的URL、和要执行的查询SQL语句的字符串,并将它们传递给创建的ResultStTableModel对象;利用ResultStTableModel对象再创建JTable的对象,并将JTable对象添加到可滚动的面板中,此滚动的面板加入到Frame中。 类DisplayQueryResults的代码
例14-11 以表格格式显示数据库的查询结果的程序执行结果
组合各数据库应用模块 前面定义和生成的各个数据库应用模块,应组合生成一完整的应用。Design for Menu and Multiple window。 定义一主框架JFrame,在JFrame的构造方法中加入菜单条。 this.setJMenuBar(jMenuBar1); 定义JMenuBar、JMenu和MenuItem,in MenuItem中写事件代码(调用各个数据库应用模块) Multiple window的切换 在创建子窗口对象时通过构造方法将父窗口对象传递给子窗口,以便子窗口返回到父窗口时,恢复父窗口使用。 子窗口对象.setVisible(true); 父窗口对象.setVisible(false);
组合各数据库应用模块(续) 为了加快访问数据库的操作,将定义和生成在各个数据库应用模块中数据库的连接和关闭操作抽象出来放在一单独的类中,此类中的方法和域成员全部是static。在进入系统时,调用此类的数据库连接方法,在退出系统时调用数据库关闭操作方法。
Menu Design Note: onle in MenuItem中写事件代码. in menu 中写事件代码运行无结果.
小结 Java程序使用JDBC API 与数据库进行通信,并用它操纵数据库中的数据。 JDBC驱动器实现与某个数据库的接口。 Java.sql包提供访问数据库的类和接口。 SQL是所有关系数据库的查询通用语言。 本章详细讨论了JDBC API 中的主要类和接口,包括DriverManeger、Connection 、Statement、PreparedStatement、CallableStatement 、ResultSet、ResultSetMetaData、DatabaseMetaData,以及GUI组件JTable和AbstractTableModel类以二维表格形式显示查询结果,并结合实例讨论了如何利用这些类对数据库进行插入、修改、删除和查询操作的示范性的程序设计。
作业 书上本章习题中: 1. 3. 4. 5.