当前位置: 首页 > 图灵资讯 > 技术篇> Java数据库编程中查询结果的表格式输出

Java数据库编程中查询结果的表格式输出

来源:图灵教育
时间:2024-02-22 14:38:18

---- 在使用Java开发数据库应用系统时,通常需要在用户界面上显示查询结果。由于SUN提供的JDK1.x开发工具包不是可视化的集成开发环境(IDE),不能像Delphi那样、VB很容易在DBGrid等表格中显示查询结果。所以只能靠自己编写代码来实现。

 

---- 在实际应用中,我们可以使用Vector、JTable、AbstractableModel等三类更好地解决了这一问题。下面,详细介绍实现方法。

---- 一、类Vector、类JTable和类Abstracttablemodel简介:

---- 1、类Vector:

---- 类Vector是Java的历史集合类,属于Java.util包。它包装了异构链表和数组杂合体,具有以下两个特点:

---- (1)向量是异构的,不要求每个元素的类型相同,向量中可以混合多种对象类型;

---- (2)向量是数组杂合体,因为它们可以在增加元素时动态增加。

---- 其异构性正好符合数据库记录中属性类型不同的特点,其动态性正好符合数据库查询时结果集记录数量不确定的特点。

---- 类Vector定义如下:

public class Vector extends AbstractListimplements List , Cloneable , Serializable{…}

---- 找到、添加、删除向量成员等方法已经实现。例如:add(Object obj)可以很容易地添加一个对象;get(int index)向量中的对象可以很容易地获得;remove(Object obj)向量中的一个对象可以很容易地删除。

---- 2、类JTable:

---- JTable组件是Swing组件中比较复杂的一个小组件,属于Javaxx.以二维表的形式显示数据的swing包。类JTable定义如下:

public class JTable extends JComponentimplements TableModelListener,Scrollable, TableColumnModelListener,ListSelectionListener,CellEditorListener, Accessible{…}

---- 类JTable在显示数据时具有以下特点:

---- (1)可定制性:可定制数据显示模式和编辑状态;

---- (2)异构性:可显示不同类型的数据对象,甚至包括颜色、图标等复杂对象;

---- (3)简单性:二维表可以通过缺乏方式轻松建立。

---- 它的定制性可以满足不同用户和场合的要求,异构性正好符合数据库访问结果不同集中属性类型的特点。JTable提供了非常丰富的二维表格操作方法,如设置编辑状态、显示模式、选择行列等。

---- 在使用JTable显示数据之前,必须根据情况生成定制模型、单元绘制器或单元编辑器。Abstractlistmodel用于定制用户自己的数据模型,以后再介绍。Tablecellrenderer接口用于定制单元绘制器,Tableceleditor接口用于定制单元编辑器。这两个接口主要用于颜色对象的处理,在例子中没有使用,也没有做太多的解释。

---- 3、AbstractTableModel:

---- AbstractableModel是一种抽象类,没有完全实现,不能实例化,必须在程序中实现。它属于javax.swing.table 。类别定义如下:

public abstract class AbstractTableModel extends Objectimplements TableModel, Serializable{…}

---- 类AbstractableModel提供了TableModel接口中绝大多数方法的缺失。TableModel接口定义JTable 基础数据结构。为了生成自己的数据模型,用户本可以通过在TableModel接口中实现所有方法来满足要求,但对所有数据模型来说,管理受众表的功能是共同的,因此在javax中.swing.table还定义了类abstractableModel来处理这项工作。它不仅管理观众表,还为生成TableModelEvents事件和委托观众提供了便利。

---- 作为AbstractableMode的子类,至少有三种方法可以生成特定的TableModel:

public int getRowCount();public int getColumnCount();public Object getValueAt(int row, int column);

---- 到目前为止,我们可以建立一个简单的二维表(5×5)实现方法如下:

TableModel dataModel = new AbstractTableModel() {public int getColumnCount() { return 5; }public int getRowCount() { return 5;}public Object getValueAt(int row, int col){ return new Integer(row*col); }};JTable table = new JTable(dataModel);JScrollPane scrollpane = new JScrollPane(table);

---- 二、数据库及其连接方式简介:

---- 实例采用Sybase数据库系统,数据库存储在数据库服务器中。路径如下:D:\WORKER,数据库名称:worker.dbf。具有以下字段:

字段名 Wno(员工号)的类型 VARCHARWname(职工名) VARCHARSex(性别) VARCHARBirthday(出生日期) DATEWage(工资) FLOAT

---- 要连接这个数据库,需要使用java.sql包中的类DriverManager。这是一个用于管理JDBC驱动程序的实用程序。它提供连接、注册、取消驱动程序、设置注册和数据库访问登录加班等方法。具体的连接方法如下:

---- 第一步:Sybdriver类的定位、装入和链接;

driver="com.sybase.jdbc.SybDriver";SybDriver sybdriver=(SybDriver)Class.forName(driver).newInstance();

---- 第二步:注册Sybdriver类;

DriverManager.registerDriver(sybdriver);

---- 第三步:获取连接(SybConnection)对象引用。

user="sa";password="";url="jdbc:sybase:Tds:202.117.203.114:5000/WORKER";SybConnection connection=(SybConnection)DriverManager.getConnection(url,user,password);

---- 建立连接后,可以通过Statement接口查询和更改数据库。

---- 三、实现方法:

---- 由于篇幅有限,这里只给出核心代码,包括介绍、界面处理、变量定义等。第一步:对象声明。

AbstractTableModel tm;//声明AbstractableModel对象JTable jg_table;//声明JTable对象Vector vect;//声明向量对象JScrolPane jsp;//声明滚动杠对象String title[]={"职工号",“职工名”、“性别”、“出生日期”、“工资”};///二维表列名

---- 步骤二:定制表格。

---- 1、在抽象AbstractableModel对象tm中实现方法:

vect=new Vector();//实例化向量tm=new AbstractTableModel(){public int getColumnCount(){return title.length;}//获得表格列数publicc int getRowCount(){return vect.size();}//获得表格行数public Object getValueAt(int row,int column){if(!vect.isEmpty())return((Vector)vect.elementAt(row)).elementAt(column);elsereturn null;}///获得单元格中的属性值public String getColumnName(int column){return title[column];}//public设置表格列名public void setValueAt(Object value,int row,int column){}//数据模型不能编辑,该方法设置为空public Class getColumnClass(int c){return getValueAt(0,c).getClass();}///获得列对象类public boolean isCellEditable(int row,int column){return false;}//设置单元格不能编辑,为缺省实现};

---- 2、定制表格:

jg_table=new JTable(tm);////生成自己的数据模型jg_table.setToolTipText(“显示所有查询结果”);///设置帮助提示jg_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//设置表格调整尺寸模式jg_table.setCellSelectionEnabled(false);///设置单元格选择方法jg__table.setShowVerticalLines(true);///设置是否显示单元格间的分割线jg_table.setShowHorizontalLines(true);jsp=new JScrollPane(jg_table);////在表格中加入滚动杠

---- 第三步:显示查询结果。

---- 1、连接数据库:已给出第二部分。

---- 2、数据库查询:

Statement stmt=connection.createStatement();ResultSet rs=stmt.executeQuery("select * from worker");

---- 3、显示查询结果:

vect.removeAllElements();//TM初始化向量对象.fireTableStructureChanged();///更新表内容whilele内容(rs.next()){Vector rec_vector=new Vector();///从结果中集中数据,放入向量rec_vector中rec_vector.addElement(rs.getString(1));rec_vector.addElement(rs.getString(2));rec_vector.addElement(rs.getString(3));rec_vector.addElement(rs.getDate(4));rec_vector.addElement(new Float(rs.getFloat(5)));vect.addElement(rec_vector);////向量rec_vector加入向量vect中}tm.fireTableStructureChanged();//更新表格,显示向量vect的内容

---- 有两种方法可以记录前翻和后翻的效果:

---- 1.如果软件环境支持JDBC2.0,可以直接使用rs.prevoius()和rs.next()通过类JTextField中的settext()方法获取记录,然后显示每个字段值。

---- 2、如果不支持JDBC2.0,则可以使用向量Vector按行取出JTable中的数据。定制一个用于记录位置的指针。当指针添加1时,取出前一行数据并放入Vector中显示;当指针减少1时,取出下一行数据显示。显示方法相同。

---- 需要注意的是,在实际应用中,必须给出代码中未给出捕捉例外的部分,如SQLException。此外,在某些系统中,文本域中的汉字可能无法正确显示,这需要通过其他方法来实现。