用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();//刷新窗体,重新显示表格。
}
运行程序,显示界面如图:
