Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable与innerJoin语句组合_Java_Mysql_Jdbc - Fatal编程技术网

Java JTable与innerJoin语句组合

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);

我有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 (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