SQL查询到JTable

时间:2016-02-09 19:26:26

标签: arraylist jtable

我找到了一个完全有效的查询,它从Oracle DB获取列及其数据,并将输出放在控制台打印输出中。

我花了3个小时试图在Swing JTable中显示这些数据。

当我尝试使用JTable绑定数据时:

jTable1.setModel(new javax.swing.table.DefaultTableModel(
            data, header
        ));

它一直告诉我构造函数无效。这是真的,因为我需要数组[]和[] []才能做到这一点。任何想法如何实现?

以下是原始查询:

package com.javacoderanch.example.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import java.util.ArrayList;

public class MetadataColumnExample {

    private static final String DRIVER = "oracle.jdbc.OracleDriver";
    private static final String URL = "jdbc:oracle:thin:@//XXX";
    private static final String USERNAME = "XXX";
    private static final String PASSWORD = "XXX";

    public static void main(String[] args) throws Exception {

        Connection connection = null;

        try {
            //
            // As the usual ritual, load the driver class and get connection
            // from database.
            //
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            //
            // In the statement below we'll select all records from users table
            // and then try to find all the columns it has.
            //
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("select *\n"
                    + "from booking\n"
                    + "where TRACKING_NUMBER = 1000001741");

            //
            // The ResultSetMetaData is where all metadata related information
            // for a result set is stored.
            //
            ResultSetMetaData metadata = resultSet.getMetaData();
            int columnCount = metadata.getColumnCount();

            // 
            // To get the column names we do a loop for a number of column count
            // returned above. And please remember a JDBC operation is 1-indexed
            // so every index begin from 1 not 0 as in array.
            //
            ArrayList<String> columns = new ArrayList<String>();
            for (int i = 1; i < columnCount; i++) {
                String columnName = metadata.getColumnName(i);
                columns.add(columnName);
            }

            //
            // Later we use the collected column names to get the value of the
            // column it self.
            //
            while (resultSet.next()) {
                for (String columnName : columns) {
                    String value = resultSet.getString(columnName);
                    System.out.println(columnName + " = " + value);
                }
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            connection.close();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好的,我发现在不使用ArrayList的情况下将SQL查询添加到JTable的方法要好一些。也许对某人有帮助,完全正常工作:

import java.awt.*;
import javax.swing.*;
import java.sql.*;
import java.awt.image.BufferedImage;

public class report extends JFrame {

    PreparedStatement ps;
    Connection con;
    ResultSet rs;
    Statement st;
    JLabel l1;
    String bn;
    int bid;
    Date d1, d2;
    int rows = 0;
    Object data1[][];
    JScrollPane scroller;
    JTable table;

    public report() {

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());

        setSize(600, 600);
        setLocation(50, 50);
        setLayout(new BorderLayout());
        setTitle("Library Report");

        try {
            Class.forName("oracle.jdbc.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@XXXXX", "XXXXX", "XXXXX");
        } catch (Exception e) {
        }

        try {
            /*
             * JDBC 2.0 provides a way to retrieve a rowcount from a ResultSet without having to scan through all the rows
             * So we add TYPE_SCROLL_INSENSITIVE & CONCUR_READ_ONLY
             */
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);    //Creating Statement Object
        } catch (SQLException sqlex) {
            System.out.println("!!!###");
        }

        try {

            rs = st.executeQuery("select TRACKING_NUMBER, INCO_TERM_CODE, MODE_OF_TRANSPORT\n"
                    + "from salog.booking\n"
                    + "where rownum < 5");

            // Counting rows
            rs.last();
            int rows = rs.getRow();
            rs.beforeFirst();

            System.out.println("cc " + rows);

            ResultSetMetaData metaData = rs.getMetaData();
            int colummm = metaData.getColumnCount();
            System.out.println("colms =" + colummm);

            Object[] Colheads = {"BookId", "BookName", "rtyry"};

            if (Colheads.length != colummm) {
                // System.out.println("EPT!!");
                JOptionPane.showMessageDialog(rootPane, "Incorrect Column Headers quantity listed in array! The program will now exit.", "System Error", JOptionPane.ERROR_MESSAGE);
                System.exit(0);
            }

            data1 = new Object[rows][Colheads.length];

            for (int i1 = 0; i1 < rows; i1++) {
                rs.next();
                for (int j1 = 0; j1 < Colheads.length; j1++) {
                    data1[i1][j1] = rs.getString(j1 + 1);
                }
            }

            JTable table = new JTable(data1, Colheads);

            JScrollPane jsp = new JScrollPane(table);

            getContentPane().add(jsp);

        } catch (Exception e) {
        }

        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main(String args[]) {
        JFrame frm = new report();
        frm.setSize(600, 600);
        frm.setLocation(50, 50);
        BufferedImage image = null;

        frm.setIconImage(image);
        frm.setVisible(true);
        frm.show();
    }
}