使用JDBC创建数据库对象(5) |
|
www.nanhushi.com 佚名 不详 |
使用JDBC创建数据库对象(5)
· 构建更高级别的JDBC对象 从上面的例子可以明显看出,如果可以将我们使用过的一些方法封装在几个更高级别对象中,那将非常有帮助,我们不仅可以封装 try 程序块,而且可以更简单地访问 ResultSet 方法。
在这一部分中,我们将构建一个新的 resultSet 对象,该对象封装了JDBC ResultSet 对象,并以String数组的形式返回一行数据。我们发现您始终需要从 ResultSetMetaData 对象中获取列的序号和名称,因此,创建一个封装元数据的新对象就非常合理。
另外,我们经常需要按名称或整数索引提取某行的元素,如果不必总是将这些访问语句包括 try 块中,那将大有帮助。最后一点,如果我们需要整行的内容,则更方便的做法是将整行以String数组形式返回。在下面所示的 resultSet 对象中,我们致力于实现这些目标:
class resultSet { // 这个类是 JDBC ResultSet 对象的更高级抽象
ResultSet rs; ResultSetMetaData rsmd; int numCols; public resultSet(ResultSet rset) { rs = rset; try { // 同时获取元数据和列数
rsmd = rs.getMetaData(); numCols = rsmd.getColumnCount(); } catch (Exception e) {System.out.println("resultset error" +e.getMessage());} } //-- public String[] getMetaData() { // 返回包含所有列名或其他元数据的
// 一个数组
String md[] = new String[numCols]; try { for (int i=1; i<= numCols; i++) md[i-1] = rsmd.getColumnName(i); } catch (Exception e) {System.out.println("meta data error"+ e.getMessage());} return md; } //-- public boolean hasMoreElements() { try{ return rs.next(); } catch(Exception e){return false;} } //-- public String[] nextElement() { // 将行的内容复制到字符串数组中
String[] row = new String[numCols]; try { for (int i = 1; i <= numCols; i++) row[i-1] = rs.getString(i); } catch (Exception e) {System.out.println("next element error"+ e.getMessage());} return row; } //-- public String getColumnValue(String columnName) { String res = ""; try { res = rs.getString(columnName); } catch (Exception e) {System.out.println("Column value error:"+ columnName+e.getMessage());} return res; } //-- public String getColumnValue(int i) { String res = ""; try { res = rs.getString(i); } catch (Exception e) {System.out.println("Column value error:"+ columnName+e.getMessage());} return res; } //-- public void finalize() { try{rs.close();} catch (Exception e) {System.out.println(e.getMessage());} } } | 通过简单使用 new 操作符就地创建一个 ResultSet 对象,我们很容易将任何 ResultSet 对象封装在此类中:
ResultSet results = .. // 按通常的方法获得 ResultsSet // 利用它创建一个更有用的对象
resultSet rs = new resultSet(results); | 并很容易在任何 JDBC 程序中使用这个对象。
· 构建一个Database对象
我们沿 00 链向上移的另一部分努力是创建一个 Database 对象,它将封装下列对象的行为: Connection 、 Statement 和 DatabaseMetaData 对象, 以及我们刚刚构建的 SQL 查询和 resultSet 。我们的 Database 对象允许我们创建连接、获取表名、在数据库中移动以及更简单地获得行和列的值。请注意, Execute 方法返回一个 resultSet 对象,您可以直接对它进行操作。
class Database { // 这是一个将 JDBC 数据库的所有功能封装在单个对象中的类
Connection con; resultSet results; ResultSetMetaData rsmd; DatabaseMetaData dma; String catalog; String types[]; public Database(String driver) { types = new String[1]; types[0] = "TABLES"; // 初始化类型
try{Class.forName(driver);} // 加载 JDBC-ODBC 桥驱动程序
catch (Exception e) {System.out.println(e.getMessage());} } //-- public void Open(String url, String cat) { catalog = cat; try {con = DriverManager.getConnection(url); dma =con.getMetaData(); // 获取元数据
} catch (Exception e) {System.out.println(e.getMessage());} } //-- public String[] getTableNames() { String[] tbnames = null; Vector tname = new Vector(); // 将表名添加到一个 Vector 中,
// 因为我们不知道有多少个表
try { results = new resultSet(dma.getTables(catalog, null, "%", types));
while (results.hasMoreElements()) tname.addElement(results.getColumnValue("TABLE_NAME"));
} catch (Exception e) {System.out.println(e);} // 将表名复制到一个 String 数组中
tbnames = new String[tname.size()]; for (int i=0; i< tname.size(); i++) tbnames[i] = (String)tname.elementAt(i); return tbnames; } //-- public String[] getTableMetaData() { // 返回表类型的信息
results = null; try{ results = new resultSet(dma.getTables(catalog, null, "%", types)); } catch (Exception e) {System.out.println(e.getMessage());} return results.getMetaData(); } //-- public String[] getColumnMetaData(String tablename) { // 返回一个列的数据
results = null; try { results = new resultSet(dma.getColumns(catalog, null, tablename, null)); } catch (Exception e) {System.out.println(e.getMessage());} return results.getMetaData(); } //-- public String[] getColumnNames(String table) { // 返回一个列名数组
String[] tbnames = null; Vector tname = new Vector(); try { results = new resultSet(dma.getColumns(catalog, null, table, null)); while (results.hasMoreElements() ) tname.addElement(results.getColumnValue("COLUMN_NAME")); } catch (Exception e) {System.out.println(e);} tbnames = new String[tname.size()]; for (int i=0; i< tname.size(); i++) tbnames[i] = (String)tname.elementAt(i); return tbnames; } //-- public String getColumnValue(String table, String columnName) { // 返回给定列的值 String res = null; try { if (table.length()>0) results = Execute("Select " + columnName + " from " + table + " order by "+columnName); if (results.hasMoreElements()) res = results.getColumnValue(columnName); } catch (Exception e) {System.out.println("Column value error" + columnName+ e.getMessage());} return res; } //-- public String getNextValue(String columnName) { // 使用存储的 resultSet // 返回该列的下一个值
String res = ""; try { if (results.hasMoreElements()) res = results.getColumnValue(columnName); } catch (Exception e) {System.out.println("next value error"+ columnName+ e.getMessage());} return res; } //-- public resultSet Execute(String sql) { // 对此数据库执行一个 SQL 查询
results = null; try { Statement stmt = con.createStatement(); results = new resultSet(stmt.executeQuery(sql)); } catch (Exception e) {System.out.println("execute error"+ e.getMessage());} return results; } } |
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: 使用JDBC创建数据库对象(4) 下一篇文章: 使用JDBC创建数据库对象(6) |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|