JDBC中的用户界面 - 查看表

时间:2015-12-31 15:22:16

标签: java swing jdbc jtable

我希望我的程序使用TRANSACTION输出JTable表,然后会出现窗口但是没有表存在。

这部分已经解决了 SQL异常occuredjava.sql.SQLException:无法转换为内部表示
    SQL exception exception occuredjava.sql.SQLException:无法转换为内部表示

我的代码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.ActionListener;

import java.sql.* ; 
import java.sql.SQLException;

public class ShowTransaction extends JFrame implements ActionListener{
    final JButton mainMenuButton = new JButton("Main Menu");

    static ShowTransaction show = new ShowTransaction();

    public ShowTransaction(){
        super("Show Transactions");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainMenuButton.setName("main");


        try{
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@VAIO:49160:xe","mariel","1234");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM transaction");
            while (rs.next()) {
                Object[][] data = {
                    {rs.getInt("trans_num"), rs.getInt("trans_custnum"), rs.getInt("trans_payment"), rs.getString("trans_paymentdesc"), rs.getString("trans_cust_credcard"), rs.getInt("trans_change")}
                };
                String[] headers = {"Transaction Number", "Customer Number", "Payment", "Method of Payment", "Credit Card", "Change"};

                JTable table = new JTable(data, headers);
                JFrame frame = new JFrame();
                Container contentPane = frame.getContentPane();
                contentPane.setLayout(new BorderLayout());
                contentPane.add(new JScrollPane(table), BorderLayout.CENTER);
                contentPane.add(mainMenuButton, BorderLayout.SOUTH);

                pack();
            }
        }
        catch(SQLException e){
            System.out.println("SQL exception occured" + e);
        }

        mainMenuButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e){
        if(mainMenuButton.getName().equals(((Component)e.getSource()).getName())){
            AdminMode admin = new AdminMode();
            admin.setVisible(true);
            admin.setResizable(false);
            admin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            admin.setSize(400,300);
            this.setVisible(false);
        }
    }

    public static void main(String args[]){  
        new ShowTransaction().setVisible(true);
    }
}

编辑:我的sql开发人员中的TRANSACTION表就像this

2 个答案:

答案 0 :(得分:3)

我建议将该表重命名为CustomerTransaction;除Oracle keyword transaction之外的任何其他内容。

从简单的Java界面开始:

package dao;

public interface CustomerTransactionDao {
    List<CustomerTransaction> find();
}

然后是一个实现类:

package dao;

public class CustomerTransactionDaoImpl implements CustomerTransactionDao {

    // Think about column and table names.  They should be descriptive.  No need for "trans_; you know they're in the customer transaction table already.
    private static final String BASE_SELECT_SQL = "select id, customerId, paymentAmount, paymentDescription, creditCardNumber, change from customerTransaction "; 

    public List<CustomerTransaction> find() {
        List<CustomerTransaction> customerTransactions = new ArrayList<CustomerTransaction>();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // Query and mapping logic here.
        } catch (Exception e) {
            throw new RuntimeException("Database access error", e);
        } finally {
            // close your resources in individual try/catch blocks inside the method.
            DatabaseUtils.close(rs);
            DatabaseUtils.close(ps);
        } 
        return customerTransactions;
    }
}

答案 1 :(得分:1)

不要在循环中创建新的2D数组。您将只读取您读取的ResultSet中最后一行的数据。

相反,你的逻辑应该是这样的:

String[] headers = {"Transaction Number", "Customer Number", .. };
DefaultTableModel model = new DefaultTableModel(headers, 0);

while (rs.next())
{
    Vector<Object> row = new Vector<Object>(columns);

    for (int i = 1; i <= columns; i++)
    {
        row.addElement( rs.getObject(i) );
    }

    data.addElement( row );
}

rs.close();
stmt.close();
connection.close();

JTable table = new JTable( model );

上面的代码以一个只有列标题的空TableModel开头。然后,它为ResultSet中的每一行添加数据。

如果要为CustomerTransaction创建自定义对象,则还需要创建自定义TableModel。查看Row Table Model以了解如何完成此操作的方法。