Java JTable与innerJoin语句组合
我有2个数据库表,我想把它们连接成一个JTable。起初,我为2个数据库表创建了2个JTable,但我想尝试一下,将它们放入1个JTable中,并将它们组合起来。我的第一个db表“控制台”由3列(id、名称和成本)组成,第二个db表“硬件”由4列(id、CPU、内存和HDD)组成 我的问题在循环中。当我写作时Java JTable与innerJoin语句组合,java,mysql,jdbc,Java,Mysql,Jdbc,我有2个数据库表,我想把它们连接成一个JTable。起初,我为2个数据库表创建了2个JTable,但我想尝试一下,将它们放入1个JTable中,并将它们组合起来。我的第一个db表“控制台”由3列(id、名称和成本)组成,第二个db表“硬件”由4列(id、CPU、内存和HDD)组成 我的问题在循环中。当我写作时 while (rs.next()) { a = rs.getString(1); b = rs.getString(2); c = rs.getString(3);
while (rs.next()) {
a = rs.getString(1);
b = rs.getString(2);
c = rs.getString(3);
while (rss.next()) {
aa = rss.getString(2);
bb = rss.getString(3);
cc = rss.getString(4);
}
model.addRow(new Object[] { a, b, c, aa, bb, cc });
}
对于aa、bb、cc,我得到了相同的值,这是第二个表的CPU、内存和HDD
当我写作时
while (rs.next()) {
a = rs.getString(1);
b = rs.getString(2);
c = rs.getString(3);
while (rss.next()) {
aa = rss.getString(2);
bb = rss.getString(3);
cc = rss.getString(4);
model.addRow(new Object[] { a, b, c, aa, bb, cc });
}
}
我得到了a、b、c的相同值,即第一个表的id、名称和成本
有什么想法吗
这是我的全部代码:
model = new DefaultTableModel();
table = new JTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
model.fireTableDataChanged();
model.addColumn("id");
model.addColumn("name");
model.addColumn("cost");
model.addColumn("CPU");
model.addColumn("Memory");
model.addColumn("HDD");
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost/test1?user=me&password=12345");
stmt = conn.createStatement();
stmtt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
rss = stmtt.executeQuery("SELECT * FROM hardware");
while (rs.next()) {
// a = id, b = name, c = cost
a = rs.getString(1);
b = rs.getString(2);
c = rs.getString(3);
while (rss.next()) {
// rss.getString(1) is the id,dont need that
// aa = CPU, bb = Memory, cc = HDD
aa = rss.getString(2);
bb = rss.getString(3);
cc = rss.getString(4);
model.addRow(new Object[] { a, b, c, aa, bb, cc });
}
}
model.fireTableDataChanged();
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(true);
table.setFillsViewportHeight(true);
table.setSurrendersFocusOnKeystroke(true);
table.setBounds(218, 59, 529, 360);
frame.getContentPane().add(table);
model.fireTableDataChanged();
conn.close();
stmt.close();
stmtt.close();
rs.close();
rss.close();
}
catch (SQLException case1) {
case1.printStackTrace();
}
catch (Exception case2) {
case2.printStackTrace();
}
结果集应返回每个结果所需的所有字段。您不必使用两个查询。选择如下所示的各个字段
select c.field1, c.field2, h.field1 ...
from consolas c inner join hardware h
on c.someField = h.someField
我从没见过有人做你想做的事。也许你应该复习一些sql教程
当你同时做这两件事时,所发生的事情并不是你所期望的。您的第一个查询将已返回所有字段。这就是连接的要点。您可能没有从rs.getXxx()中获得所有结果,因为您可能没有预料到这些结果
您可以使用ResultSetMetaData类执行一个简单的测试,以获取列计数,并打印出所有值。差不多
ResultSet rs = ...
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
然后使用列计数作为最大循环迭代遍历结果集。比如说
while(rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getObject(i) + ", ");
}
System.out.println();
}
while(rs.next()){
对于(int i=1;i您的结果集应返回每个结果所需的所有字段。您不必使用两个查询。请选择如下单个字段
select c.field1, c.field2, h.field1 ...
from consolas c inner join hardware h
on c.someField = h.someField
我从未见过有人做过你想做的事。也许你应该复习一些sql教程
当您同时执行这两项操作时,所发生的情况并不是您所期望的。您的第一个查询将已经返回所有字段。这就是连接点。您可能无法从rs.getXxx()中获得所有结果,因为您可能不期望这些结果
您可以使用ResultSetMetaData类执行一个简单的测试,以获取列计数,并打印出所有值
ResultSet rs = ...
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
然后使用列计数作为最大循环迭代遍历结果集
while(rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getObject(i) + ", ");
}
System.out.println();
}
while(rs.next()){
对于(int i=1;i您的结果集应返回每个结果所需的所有字段。您不必使用两个查询。请选择如下单个字段
select c.field1, c.field2, h.field1 ...
from consolas c inner join hardware h
on c.someField = h.someField
我从未见过有人做过你想做的事。也许你应该复习一些sql教程
当您同时执行这两项操作时,所发生的情况并不是您所期望的。您的第一个查询将已经返回所有字段。这就是连接点。您可能无法从rs.getXxx()中获得所有结果,因为您可能不期望这些结果
您可以使用ResultSetMetaData类执行一个简单的测试,以获取列计数,并打印出所有值
ResultSet rs = ...
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
然后使用列计数作为最大循环迭代遍历结果集
while(rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getObject(i) + ", ");
}
System.out.println();
}
while(rs.next()){
对于(int i=1;i您的结果集应返回每个结果所需的所有字段。您不必使用两个查询。请选择如下单个字段
select c.field1, c.field2, h.field1 ...
from consolas c inner join hardware h
on c.someField = h.someField
我从未见过有人做过你想做的事。也许你应该复习一些sql教程
当您同时执行这两项操作时,所发生的情况并不是您所期望的。您的第一个查询将已经返回所有字段。这就是连接点。您可能无法从rs.getXxx()中获得所有结果,因为您可能不期望这些结果
您可以使用ResultSetMetaData类执行一个简单的测试,以获取列计数,并打印出所有值
ResultSet rs = ...
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
然后使用列计数作为最大循环迭代遍历结果集
while(rs.next()) {
for (int i = 1; i <= columnCount; i++) {
System.out.print(rs.getObject(i) + ", ");
}
System.out.println();
}
while(rs.next()){
对于(int i=1;i更新
ResultSet rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
String[] cols = new String[columnCount];
for (i=1;i<= columnCount;i++)
{
cols[i-1] = md.getColumnName(i);
// you had missed an "s" here, nothing important
}
DefaultTableModel model = new DefaultTableModel(cols,0);
while (rs.next())
{
Object[] row = new Object[columnCount];
for (i = 1 ; i <= columnCount ; i++)
{
row[i-1] = rs.getObject(i);
}
model.addRow(row);
}
table = new JTable(model);// table.setModel(model) created error
model.fireTableDataChanged();
ResultSet rs=stmt.executeQuery(“从控制台内部选择*在控制台上连接硬件。id=hardware.id”);
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
String[]cols=新字符串[columnCount];
对于(i=1;i更新
ResultSet rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
String[] cols = new String[columnCount];
for (i=1;i<= columnCount;i++)
{
cols[i-1] = md.getColumnName(i);
// you had missed an "s" here, nothing important
}
DefaultTableModel model = new DefaultTableModel(cols,0);
while (rs.next())
{
Object[] row = new Object[columnCount];
for (i = 1 ; i <= columnCount ; i++)
{
row[i-1] = rs.getObject(i);
}
model.addRow(row);
}
table = new JTable(model);// table.setModel(model) created error
model.fireTableDataChanged();
ResultSet rs=stmt.executeQuery(“从控制台内部选择*在控制台上连接硬件。id=hardware.id”);
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
String[]cols=新字符串[columnCount];
对于(i=1;i更新
ResultSet rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
String[] cols = new String[columnCount];
for (i=1;i<= columnCount;i++)
{
cols[i-1] = md.getColumnName(i);
// you had missed an "s" here, nothing important
}
DefaultTableModel model = new DefaultTableModel(cols,0);
while (rs.next())
{
Object[] row = new Object[columnCount];
for (i = 1 ; i <= columnCount ; i++)
{
row[i-1] = rs.getObject(i);
}
model.addRow(row);
}
table = new JTable(model);// table.setModel(model) created error
model.fireTableDataChanged();
ResultSet rs=stmt.executeQuery(“从控制台内部选择*在控制台上连接硬件。id=hardware.id”);
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
String[]cols=新字符串[columnCount];
对于(i=1;i更新
ResultSet rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
String[] cols = new String[columnCount];
for (i=1;i<= columnCount;i++)
{
cols[i-1] = md.getColumnName(i);
// you had missed an "s" here, nothing important
}
DefaultTableModel model = new DefaultTableModel(cols,0);
while (rs.next())
{
Object[] row = new Object[columnCount];
for (i = 1 ; i <= columnCount ; i++)
{
row[i-1] = rs.getObject(i);
}
model.addRow(row);
}
table = new JTable(model);// table.setModel(model) created error
model.fireTableDataChanged();
ResultSet rs=stmt.executeQuery(“从控制台内部选择*在控制台上连接硬件。id=hardware.id”);
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
String[]cols=新字符串[columnCount];
对于(i=1;i1.包装成两个模型的每个代码行。fireTableDataChanged();与JDBC无关,应该在JDBC执行之前或之后,2.不要在try-catch内创建、设置、修改GUI-最后,3.连接和语句应该在finallymodel.fireTableDataChanged()中关闭();???对于谈论EDT问题的DefaultTableModel,更多信息请参见Swing-EventDispatchThread中的Oracle tutotial Concurrency。既然您可以在一个查询中连接两个表并获得所需的所有列,为什么要有两个查询?1.每个代码行都包装到两个模型中。fireTableDataChanged();与JDBC无关,应该是在JDBC执行之前或之后;2.不要在try-catch中创建、设置、修改GUI-最后,3.连接和语句应该是finallymodel.firetabledatachange()中的close();???对于谈论EDT问题的DefaultTableModel,更多信息请参见Swing中的Oracle Tutotal Concurrency