用JDBC开发数据库万能接口

编程爱好者

在JBuilder中开发数据库应用程序时,JBuilder为我们提供了许多标准化的组件,利用这些组件不但可以很方便地进行数据库连接,查询等功能,还具有比较美观的界面。但也存在一些问题,比如JBuilder中提供的组件不能自己随意增加自己想要实现的功能,这是因为组件实际上就是别人开发的一些类,继承这些类就不能随意开发更底层的功能。经过一番尝试,笔者终于开发成功一个基于JDBC的数据库类,利用该类提供的接口函数,可以实现SQL结构化查询语言能够实现的全部功能。可以使该类独立应用于程序中,完成一般的数据库功能,如查询、删除、插入、修改等功能,不但可以以表格形式显示查询结果;还可以配合JBuilder中提供的其他标准组件,利用这些组件的界面特性和操作方便性等优势,开发实用的数据库应用程序。

一、接口函数

该类中提供了两个接口函数void getTable(String str,Container CONT)和ResultSet getRow(String strx)。其中在getTable中,参数str是要完成操作的SQL语句,CONT是用于显示查询结果的JAVA容器,如getTable("select * from student",this.getContentPane());表示查询student表中的所有记录,查询结果显示于当前窗口的容器中。而getRow(String strx)函数用于实现当不用显示查询结果,但要具体处理查询结果时,返回ResultSet类型,如:

DBDisplay db=new DBDisplay();

ResultSet RS;

RS=getRow("select * from student");

while(RS.next()){;;}

利用以上程序段就可以遍历整个数据表,实现你要实现的功能。

二、实现代码

以下是整个类的实现代码:

package mydb;//java包名称,在具体应用中可替换为工程名

import java.sql.*;

import java.util.*;

import java.awt.*;

import javax.swing.*;

public class DBDisplay {//类名称

private Connection connection;

private Statement statement;

private ResultSet resultset;

private ResultSetMetaData rsmetadata;//以上四个类型用于实现SQL数据库查询操作功能

private JTable table;//用于显示的表格

private String querystr;//查询语句

private Container c;//当前容器

public DBDisplay(){

try {

Class.forName("sun.jdbc.odbc.JdbcOdb

cDriver");//为类添加数据库驱动程序

}

catch (ClassNotFoundException ex) {}//类未发现异常

try {

connection = DriverManager.getConnec

tion("jdbc:odbc:student");//为驱动程序加载数据源,student为数据源名称

statement = connection.createStatement();//创建连接

}

catch (SQLException ex1) {}//sql执行异常

}

public void getTable(String str,Containe

r CONT) {//用于外部程序查询的接口函数,str为SQL语句,CONT为显示查询结果的容器名称

c=CONT;

try {

this.querystr=str;

if(querystr.startsWith("select") || querystr.startsWith("SELECT"))//如果是数据查询

{

this.resultset = statement.executeQuery(querystr);//执行查询

this.displayResultSet(resultset);//当查询时显示结果

}

else//不是数据查询,而是数据操作,如插入、删除等时候

statement.executeUpdate(querystr);//执行操作

}

catch (SQLException ex) {}

}

public void displayResultSet(ResultSet rs) throws SQLException {//显示查询结果

boolean moreRecord = rs.next();//是否有记录

if (!moreRecord) {

return;

}

Vector columnheads = new Vector();//列向量,用于保存字段名

Vector rows = new Vector();//行向量,用于保存记录

try {

ResultSetMetaData rsmd = rs.getMetaD

ata();//用于得到具体的字段名

for (int i = 1; i <= rsmd.getColumnCou

nt(); i++)

columnheads.addElement(rsmd.getColu

mnName(i));//加入字段名

do {

rows.addElement(getNextRow(rs, rsmd)

);

}while (rs.next());//将数据库中的所有记录加入向量

table = new JTable(rows, columnheads);//创建以columnheads为字段名,rows为记录的表格

JScrollPane scroller = new JScrollPane(table);//创建滚动表格scroller,滚动框内是table表

c.add(scroller, BorderLayout.CENTER);//加入滚动框

c.validate();//刷新窗口

}

catch (SQLException ex) {}

}

public Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)//得到下一行

throws SQLException{

Vector currentRow=new Vector();

for(int i=1;i<=rsmd.getColumnCount();i++)//将一行中的所有字段加入currentRow向量

currentRow.addElement(rs.getString(i));

return currentRow;

}

public ResultSet getRow(String strx) throws SQLException{//返回ResultSet类型,用于显示所查询的集合

this.resultset = this.statement.executeQ

uery(strx);

return this.resultset;

}

}

三、查询举例

下面,就以JBuilder X为例,新建基于窗口的Application应用程序:mydb。在主窗口中加入一个标签jLabel1,一个文本字段输入框sql1和一个按钮jButton1。为按钮jButton1添加单击事件。用于实现在文本字段输入框sql1中的SQL语句查询功能。如在文本字段输入框sql1输入:select * from student,点击按钮就能查询出student表中的所有记录,单击按钮事件代码如下:

void jButton1_actionPerformed(ActionE

vent e) {

String str;

str=sql1.getText();//得到文本输入框中的SQL语句。

DBDisplay mydb=new DBDisplay();

mydb.getTable(str,this.getContentPane());//执行查询。

this.validate();//刷新窗体,重新显示表格。

}

运行程序,显示界面如图:

48-g15-1-7.jpg