【问题标题】:User Interface in JDBC - Viewing of tableJDBC 中的用户界面 - 查看表
【发布时间】:2015-12-31 15:22:16
【问题描述】:

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

这部分已经解决
发生SQL异常java.sql.SQLException: Fail to convert to internal representation
SQL 异常发生java.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 表类似于

【问题讨论】:

  • transaction 表是什么样的?
  • 使用 SQL 关键字作为表名或列名是一个非常糟糕的主意。您应该分解这个问题,以便 UI 和数据库类是分开的。让数据库访问完美运行,然后将其与 UI 结合起来。您不关闭任何 SQL 类,这也是一个非常糟糕的主意。这段代码有很多错误。
  • 大胆猜测:把rs.getInt("trans_paymentdesc")改成rs.getString("trans_paymentdesc")
  • 我会把它编辑出来,这样你就可以看到表格了。我更改为 getString 并且它不再出错但它仍然无法查看表格。
  • 您正在为 DB 表中的每一行重新创建 JTable,这可能不是您想要的。另外,请分享完整的堆栈跟踪和数据库表描述。

标签: java swing jdbc jtable


【解决方案1】:

我建议将该表重命名为 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;
    }
}

【讨论】:

  • List&lt;CustomerTransaction&gt; find(); 错误,但我添加了导入 java.util.List; 但它仍然在 List&lt;CustomerTransaction&gt; find(); 中的 CustomerTransaction 出现错误
  • 还没有完成。这是一个需要充实的骨架。我没有编译或运行它。这是一个引导新程序员走上道路的例子。不打算成为生产代码。你应该阅读它,理解它,并添加我故意遗漏的部分,这样你就可以学到一些东西。
  • 不错。您还可以使用 try-with-resources 来简化语句和结果集处理。
  • 有趣。我仍然停留在我的 JDK8 之前的风格中。
【解决方案2】:

不要在循环中创建新的二维数组。您将永远只拥有您读取的 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 了解如何完成此操作的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多