使用来自两个数据库表 JDBC 的详细信息填充 JTable

Posted

技术标签:

【中文标题】使用来自两个数据库表 JDBC 的详细信息填充 JTable【英文标题】:Populating JTable with details from two database tables JDBC 【发布时间】:2016-03-21 14:32:18 【问题描述】:

我在此处查看了一些视频和问题,但找不到我要查找的内容。我是一个编程菜鸟(使用 Derby 数据库在 Netbeans 上用 Java 编程)所以请温柔一点。我有一个数据库,里面有 2 个表。 StudentScores 和 StudentDetails。

StudentDetails 包含 NAMEID 和 STUDENTNAME 列。

StudentScores 包含 NAMEID、SCOREID、DATETAKEN 和 SCORE 列。

我想在我的程序中有一个 JTable,它显示第一个数据库中的 NAME 列以及第二个表中的 DATATAKEN 和 SCORE。 我该怎么做? 我只找到了有关如何使用一个数据库表中的所有详细信息填充 JTable 的教程。

我还希望用户能够在组合框中选择学生的姓名时查看学生的所有记录(在 JTable 中)。我知道我必须在组合框中获取名称的 ID 并查询?

我发现了这个 http://1bestcsharp.blogspot.co.uk/2015/06/java-mysql-populate-jtable-Depending-JCombobox-Selected-Value.html

但我很困惑,因为正在创建多个类。 我必须创建多个类还是可以在同一个 JFrame 表单中全部完成?

【问题讨论】:

如果您的数据库可以在两个表之间执行连接(请阅读其他地方的连接),那么您的 Java 程序可以将连接的结果视为一张表。这会让你度过难关吗? 您好,感谢您的回复。我查看了连接,并且内部连接了我想要的两个表中的列,这现在是一个新表吗?它没有出现在Services中数据库下的“Tables”部分,在查询等时如何在主程序中引用它? @OleV.V. 不,这不是一个新表。但是您将数据从 ResultSet 获取到 TableModel 的代码并不关心 ResultSet 中的数据是如何填充的,只关心数据是否存在。所以你的问题是 SQL 问题而不是 Swing 问题。 好的,我有一些工作,但它没有显示任何数据,只是列标题。我还注意到,当我查看 StudentScores 表中的数据时,NAMEID 表示每个条目的 并且所有记录都是相同的。你认为这是问题所在吗?我该如何解决? @camickr 我认为nameid应该对每条记录都有一个唯一的值,否则你如何唯一标识每个人? 【参考方案1】:

试试这个:

import java.awt.Dimension;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Main extends JFrame 
  private JTable m_simpleTable;

  private SimpleTableModel m_simpleTableModel;

  public Main() 

    m_simpleTableModel = new SimpleTableModel(getData());
    m_simpleTable = new JTable(m_simpleTableModel);
    JScrollPane scrollPane = new JScrollPane(m_simpleTable);
    getContentPane().add(scrollPane);
  

  public Vector getData()
      Vector dummyMacData = new Vector(10, 10);
        dummyMacData.addElement(new Data(new Integer(100), "ABC", "11/12/2016","A+", "E"));
        dummyMacData.addElement(new Data(new Integer(105), "XYZ", "20/01/2015","B-", "E"));
        return dummyMacData;
  

  public static void main(String[] arg) 
    Main m = new Main();

    m.setVisible(true);
    m.setSize(new Dimension(600, 300));
    m.validate();
  

  class SimpleTableModel extends AbstractTableModel 
    public String[] m_colNames =  "Student Id", "Name", "Date","Score", "" ;

    public Class[] m_colTypes =  Integer.class, String.class, String.class, String.class,
        String.class ;

    Vector m_macDataVector;

    public SimpleTableModel(Vector macDataVector) 
      super();
      m_macDataVector = macDataVector;
    
    public int getColumnCount() 
      return m_colNames.length;
    
    public int getRowCount() 
      return m_macDataVector.size();
    
    public void setValueAt(Object value, int row, int col) 
      Data macData = (Data) (m_macDataVector.elementAt(row));

      switch (col) 
      case 0:
        macData.setStudentId((Integer) value);
        break;
      case 1:
        macData.setName((String) value);
        break;
      case 2:
        macData.setDate((String) value);
        break;
      case 3:
        macData.setScore((String) value);
        break;
      case 4:
        //macData.setE((String) value);
        break;
      
    

    public String getColumnName(int col) 
      return m_colNames[col];
    

    public Class getColumnClass(int col) 
      return m_colTypes[col];
    
    public Object getValueAt(int row, int col) 
      Data macData = (Data) (m_macDataVector.elementAt(row));

      switch (col) 
      case 0:
        return macData.getStudentId();
      case 1:
        return macData.getName();
      case 2:
        return macData.getDate();
      case 3:
        return macData.getScore();
      case 4:
        return null;//macData.getE();
      

      return new String();
    
  



class Data 
  private Integer studentId;

  private String name;

  private String date;

  private String score;

  private String e;

  public Data() 
  

  public Data(Integer aa, String bb, String cc, String dd, String ee) 
      studentId = aa;
      name = bb;
      date = cc;
      score = dd;
    e = ee;
  

public Integer getStudentId() 
    return studentId;


public void setStudentId(Integer studentId) 
    this.studentId = studentId;


public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


public String getDate() 
    return date;


public void setDate(String date) 
    this.date = date;


public String getScore() 
    return score;


public void setScore(String score) 
    this.score = score;





【讨论】:

嘿,感谢您的回复,这在主 JFrame 中对吗?因为我得到的只是 SimpleTableModel 的错误,说它已经定义了 @z33 检查已创建的对象。错误本身有足够的信息。【参考方案2】:

请在下面的链接中查看我的答案。几乎和你的问题一样。希望这会有所帮助。

How to bring all data of table in JTable and insert it into Database

【讨论】:

【参考方案3】:

只要这样做..它应该可以正常工作

Select 
  sd.NameID,
  sd.StudentsName,
  sm.DATETAKEN,
  sm.Score 
from 
  (firsttablename) sd,
  (secondtablename) sm 
where 
  sd.NameId = sm.NameId 
  and sd.NameID = (nameid you want to display data)

但在此您必须将 nameid 作为第二个表中的外键。

【讨论】:

以上是关于使用来自两个数据库表 JDBC 的详细信息填充 JTable的主要内容,如果未能解决你的问题,请参考以下文章

算法在两个表之间验证来自用户的数据,然后插入另一个表

C# 从数据库表中填充多维数组

Jpa Join 查询与来自两个表的数据,org.hibernate.MappingException:没有 JDBC 类型的方言映射:2002

使用来自单独表单 Access 2007 的用户输入自动填充表单中的字段

用数据填充视图中的表格视图,swift2

在 iOS 5 中刷新 JSON 表