如何通过自连接将同一数据库列数据展示到JTable两列?
问题分析与解决方案
我帮你排查出了代码里的几个关键问题,调整后就能正常把自连接的数据展示到JTable的两列中了:
1. SQL语句的语法错误
你的SQL字符串拼接后存在语法问题:SELECT a.nrzbor , b.nrzbor" + "FROM Zboruri a,Zboruri b 这段代码拼接后,b.nrzbor和FROM之间没有空格,会变成nrzborFROM,数据库根本无法解析这条SQL。
2. 循环内重复设置TableModel
你在while循环里每次添加行都调用jTable5.setModel(model),这完全没必要,而且会导致JTable重复刷新,影响性能。应该在所有数据行都添加到模型后,再一次性设置给JTable。
3. 资源泄漏问题
原代码没有关闭数据库连接、PreparedStatement和ResultSet,这会导致数据库资源泄漏,建议使用try-with-resources语法自动管理这些资源(Java 7及以上版本支持)。
修正后的完整代码
String de_la = introducereOras1.getText(); String la = introducereOras2.getText(); DefaultTableModel model = new DefaultTableModel(new String[]{"nrzbor1", "nrzbor2"}, 0); String url = "jdbc:mysql://localhost:3306/aeroport"; String user = "root"; String password = ""; // 使用try-with-resources自动管理资源,无需手动关闭 try (Connection myConn = DriverManager.getConnection(url, user, password); PreparedStatement myStmt = myConn.prepareStatement( "SELECT a.nrzbor, b.nrzbor FROM Zboruri a, Zboruri b " + "WHERE (a.de_la = ? AND b.de_la = ?) AND (a.la = ? AND b.la = ?)")) { myStmt.setString(1, de_la); myStmt.setString(2, la); myStmt.setString(3, la); myStmt.setString(4, de_la); try (ResultSet rs = myStmt.executeQuery()) { while (rs.next()) { String d = rs.getString("a.nrzbor"); String e = rs.getString("b.nrzbor"); model.addRow(new Object[]{d, e}); } // 所有行添加完成后,一次性设置模型 jTable5.setModel(model); } } catch(Exception e){ System.err.println("Got an exception!"); System.err.println(e.getMessage()); e.printStackTrace(); // 建议打印完整堆栈信息,方便排查问题 }
额外提示
- 测试时确保
introducereOras1和introducereOras2输入的内容在数据库Zboruri表的de_la和la列中存在,避免查询结果为空。 - 如果你的SQL逻辑是要查询“从A到B”和“从B到A”的航班对,当前的WHERE条件是正确的,但可以考虑用JOIN语法替代旧的逗号分隔表写法,可读性更强:
SELECT a.nrzbor, b.nrzbor FROM Zboruri a JOIN Zboruri b ON a.de_la = ? AND b.de_la = ? AND a.la = ? AND b.la = ?
内容的提问来源于stack exchange,提问作者Andrei Jitaru
相关产品推荐
相关产品推荐

