JAVA中从Mysql取数据到JTable

Posted

技术标签:

【中文标题】JAVA中从Mysql取数据到JTable【英文标题】:Taking data from Mysql to JTable in JAVA 【发布时间】:2015-05-03 03:05:26 【问题描述】:

我正在尝试在我的 Jtable 中获取信息并从 mysql 读取信息,看起来时代来自这个细分市场,因为我可以看到卡住了,我不知道该怎么做,现在我有一个 DefaultTableModel 定义JTable 将使用的方法,我将覆盖 getColumnClass, 我希望我的代码从类中获取列。

static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns)
     public Class getColumnClass(int column) 

           if ((column >= 0) && (column < getColumnCount())) 
                  returnValue = getValueAt(0, column);
      else 


                  returnValue;
                


            ;

【问题讨论】:

“我希望我的代码从类中获取列” - 这不是一个非常糟糕的主意。如果列的行中的值为null,会发生什么情况?最好提前知道该列负责什么类型的值。仔细查看JDBC Database Access了解更多详情 那我该怎么办?现在它不为空。我被卡住了:( 假设您正在从数据库中加载数据,您应该使用 ResultSet 对象中的 ResultSetMetaData 来获取列类型并将该信息存储在表模型中,这样您就可以根据数据库中的信息返回正确的(预期的)类型 madprogrammer 让我也在那里阅读更多内容。 【参考方案1】:

如果我清楚地理解您,您需要添加 .getclass 方法,该方法有助于将变量移到左侧,并且您还必须返回类的值,在这种情况下将按如下方式完成。取每列的第一个条目。希望能帮助到你。假设您的列没有空值。

static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns)
public Class getColumnClass(int column) 
Class returnValue;
// Verifying that the column exists (index > 0 && index < number of columns
if ((column >= 0) && (column < getColumnCount())) 
  returnValue = getValueAt(0, column).getClass();
    //you need to add the .getclass method which 
                  //gets the variable to the left.
  else 
  // Returns the class for the item in the column   
 returnValue = Object.class;
                
 return returnValue;
              
            ;

【讨论】:

getValueAt(0, column)null 时会发生什么?坦率地说,这不仅愚蠢,而且非常危险。更好的解决方案是现在每列的类类型是什么,而不依赖于表中的数据(数据应遵循列的约定)。根据我对 OP 试图做什么的“假设”,他们应该从ResultSetMetaData 中提取这些信息 @syombua 让我试试这个,实际上我知道我的错误在哪里。等我几秒钟回来告诉你它是否有效。 现在我传递的参数没有空值了。嘿 syombua 这很好。我很感激。自变量现在起作用了。【参考方案2】:

我们需要稍微修改TableModel,这样我们就可以控制Class列的类型...

public class MyTableModel extends DefaultTableModel 

    private List<Class> columnTypes;

    public MyTableModel() 
    

    public MyTableModel(int rowCount, int columnCount) 
        super(rowCount, columnCount);
    

    public MyTableModel(Vector columnNames, int rowCount) 
        super(columnNames, rowCount);
    

    public MyTableModel(Object[] columnNames, int rowCount) 
        super(columnNames, rowCount);
    

    public MyTableModel(Vector data, Vector columnNames) 
        super(data, columnNames);
    

    public MyTableModel(Object[][] data, Object[] columnNames) 
        super(data, columnNames);
    

    public MyTableModel(List<Class> columnTypes) 
        this.columnTypes = columnTypes;
    

    public MyTableModel(List<Class> columnTypes, Object[] columnNames, int rowCount) 
        super(columnNames, rowCount);
        this.columnTypes = columnTypes;
    

    public MyTableModel(List<Class> columnTypes, Object[][] data, Object[] columnNames) 
        super(data, columnNames);
        this.columnTypes = columnTypes;
    

    public MyTableModel(List<Class> columnTypes, Vector data, Vector columnNames) 
        super(data, columnNames);
        this.columnTypes = columnTypes;
    

    public MyTableModel(List<Class> columnTypes, Vector columnNames, int rowCount) 
        super(columnNames, rowCount);
        this.columnTypes = columnTypes;
    

    public MyTableModel(List<Class> columnTypes, int rowCount, int columnCount) 
        super(rowCount, columnCount);
        this.columnTypes = columnTypes;
    

    public void setColumnTypes(List<Class> columnTypes) 
        this.columnTypes = columnTypes;
    

    @Override
    public Class<?> getColumnClass(int columnIndex) 
        return columnTypes.get(columnIndex);
    


然后,我们从数据库中加载数据,您可以使用ResultSet中的ResultSetMetaData来确定该列代表的最合适的对象类型(基于ResultSet#getObject的返回结果)

MyTableModel tableModel = new MyTableModel();
try (ResultSet rs = ...) 
    ResultSetMetaData rsmd = rs.getMetaData();
    List<Class> columnTypes = new ArrayList<Class>(rsmd.getColumnCount());
    for (int column = 0; column < rsmd.getColumnCount(); column++) 
        String className = rsmd.getColumnClassName(column + 1);
        try 
            columnTypes.add(Class.forName(className));
         catch (ClassNotFoundException ex) 
            ex.printStackTrace();
            columnTypes.add(Object.class);                  
        
    
    tableModel.setColumnTypes(columnTypes);

    // Load data from the ResultSet
 catch (SQLException exp) 
    exp.printStackTrace();

更多详情请见JDBC Database Access...

【讨论】:

非常复杂。我很快就会到那里。

以上是关于JAVA中从Mysql取数据到JTable的主要内容,如果未能解决你的问题,请参考以下文章

在java中从mysql获取表元数据

java中从数据库中模糊查询问题

java - 如何在Java中从MySQL结果集中的while循环中添加值?

ssm中从页面到controller和数据库出现乱码问题的解决

在此代码中从 mysql 数据库中获取数据问题

如何在 C# 中从 MySQL 中检索 tinyint 的数据类型?