Java 如何在MySQL中动态转换行到列并在Swing中显示结果

Java 如何在MySQL中动态转换行到列并在Swing中显示结果,java,mysql,swing,Java,Mysql,Swing,我试图在MySQL中动态地将行转换为列,并在Java/Swing中显示结果 我用于将行转换为列的代码如下 SET @cols = NULL; SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(Name = ''', Name, ''', Amount , NULL)) AS ', '''', Name , '''') ) INTO @cols FROM table1; SET @sql = CONC

我试图在MySQL中动态地将行转换为列,并在Java/Swing中显示结果

我用于将行转换为列的代码如下

SET @cols = NULL;
SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(Name = ''',
      Name, ''', Amount , NULL)) AS ', '''', Name , '''')
  ) INTO @cols
FROM table1;


SET @sql = CONCAT('SELECT 
  Date, ', @cols , ', SUM(Amount) AS Total 
FROM table1
GROUP BY Date;');

prepare stmt 
FROM @sql;

execute stmt;

虽然我在MySQL中获得了结果,但我不知道如何使用该代码并在Java Swing中显示结果。

使用准备好的语句创建存储过程

首先,你必须。我没有测试您的代码,但是可以使用如下代码创建存储过程

DROP PROCEDURE IF EXISTS execSql;
DELIMITER //
CREATE PROCEDURE execSql () 
BEGIN

  SET @sql = CONCAT( ...

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
使用JDBC调用MySQL存储过程

JDBC提供了一个
CallableStatement
类,可以用来调用存储过程。您可以查看教程以了解更多信息

在Swing JTable中显示结果

要显示数据,可以使用结果集创建一个
表格模型
。有许多类/库可用于使用resultset(例如或)填充TableModel

转置表格模型

有时,您希望将查询结果转置(将行转换为列)。虽然是MySQL,但您可以转置Swing的TableModel。我认为转置TableModel是更好(更简单)的选择

基本上,你可以转换结果。您可以检查和。
TransposedTableModel
的代码可能如下所示

public TransposedTableModel extends AbstractTableModel {

  private TableModel innerTableModel;

  public TransposedTableModel(TableModel innerTableModel) {
     this.innerTableModel = innerTableModel;
  }

  @Override
  public int getRowCount() {
     return innerTableModel.getColumnCount();
  }

  @Override
  public   int getColumnCount() {
     return innerTableModel.getRowCount();
  }

  Override
  public   Object getValue(int row, int column) {
     return innerTableModel.getValue(column, row);
  }
};
然后,您可以使用“普通”SQL,并使用转置的TableModel

stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table1");

TableModel normalTableModel = DBUtils.resultSetToTableModel(rs);
TableModel transposedTableModel = new TransposedTableModel(normalTableModel);

JTable swingTable = new JTable (transposedTableModel);

请澄清你的问题您想和吗?是的,我想调用这个mysql过程并在jtable中显示它,您能用示例指导我吗?如果你想转置结果,我认为你必须转置Java中的TableModel,而不是“动态地将行转换为列”
,并在jtable中显示它,
——论坛和web上有很多例子展示了如何做到这一点。首先,您可以使用
JTable
ResultSet
搜索此论坛,以查找示例,说明如何使用ResultSet中的数据创建
TableModel
。这就是你解决许多问题的方法。您只需选择几个关键字并进行搜索。
public TransposedTableModel extends AbstractTableModel {

  private TableModel innerTableModel;

  public TransposedTableModel(TableModel innerTableModel) {
     this.innerTableModel = innerTableModel;
  }

  @Override
  public int getRowCount() {
     return innerTableModel.getColumnCount();
  }

  @Override
  public   int getColumnCount() {
     return innerTableModel.getRowCount();
  }

  Override
  public   Object getValue(int row, int column) {
     return innerTableModel.getValue(column, row);
  }
};
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table1");

TableModel normalTableModel = DBUtils.resultSetToTableModel(rs);
TableModel transposedTableModel = new TransposedTableModel(normalTableModel);

JTable swingTable = new JTable (transposedTableModel);