我希望我的程序使用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);
}
}
答案 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以了解如何完成此操作的方法。