使用JDBC创建数据库对象(5)

发表于:2007-07-14来源:作者:点击数: 标签:
使用JDBC创建数据库对象(5) · 构建更高级别的JDBC对象 从上面的例子可以明显看出,如果可以将我们使用过的一些方法封装在几个更高级别对象中,那将非常有帮助,我们不仅可以封装 try 程序块,而且可以更简单地访问 ResultSet 方法。 在这一部分中,我们将
使用JDBC创建数据库对象(5)

· 构建更高级别的JDBC对象

从上面的例子可以明显看出,如果可以将我们使用过的一些方法封装在几个更高级别对象中,那将非常有帮助,我们不仅可以封装 try 程序块,而且可以更简单地访问 ResultSet 方法。

在这一部分中,我们将构建一个新的 resultSet 对象,该对象封装了JDBC ResultSet 对象,并以String数组的形式返回一行数据。我们发现您始终需要从 ResultSetMetaData 对象中获取列的序号和名称,因此,创建一个封装元数据的新对象就非常合理。

另外,我们经常需要按名称或整数索引提取某行的元素,如果不必总是将这些访问语句包括 try 块中,那将大有帮助。最后一点,如果我们需要整行的内容,则更方便的做法是将整行以String数组形式返回。在下面所示的 resultSet 对象中,我们致力于实现这些目标:

CCCCCC"> 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;
}
}


(未完待续)

原文转自:http://www.ltesting.net