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 = CONCAT('SELECT 
  Date, ', @cols , ', SUM(Amount) AS Total 
FROM table1
GROUP BY Date;');

prepare stmt 
FROM @sql;

execute stmt;

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

最佳答案

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

首先,您必须create a stored procedure using a prepared statement 。我尚未测试您的代码,但可以使用如下代码创建存储过程。

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 类,您可以使用它来调用存储过程。您可以查看 Calling MySQL Stored Procedures from JDBC 的教程.

// use CALL with the name of the stored procedure
String query = "{CALL execSql()}";

// use CallableStatement to obtain the ResultSet
CallableStatement stmt = conn.prepareCall(query)
ResultSet rs = stmt.executeQuery();

在 Swing JTable 中显示结果

要显示数据,您可以使用 ResultSet 创建一个 TableModel。您可以使用许多类/库来用结果集填充 TableModel(例如 this DbUtilsthis JDBCTableModel )。

// execute the query
String query = "{CALL execSql()}";
CallableStatement stmt = conn.prepareCall(query)
ResultSet rs = stmt.executeQuery();

// fill the TableModel with the results
TableModel normalTableModel = DBUtils.resultSetToTableModel(rs);

// create the Swing Table
JTable swingTable = new JTable (transposedTableModel);

转置 TableModel

有时您想要转置(将行转换为列)查询结果。虽然 MySQL does not support PIVOT/UNPIVOT ,您可以转置 Swing 的 TableModel。我认为转置 TableModel 是更好(更简单)的替代方案。

基本上,你可以create a TableModel wrapper转置结果。您可以查看Spring TableModelJideSoft TransposeTableModelTransposeTableModel 的代码可能类似于以下内容...

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,fill a TableModel with the result并使用转置的 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);

关于java - 如何在MySQL中动态地将行转换为列并在Swing中显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46174577/

相关文章:

java - netbeans 中缺少 defaultCloseOperation 选项

java - 如何向我的 fillRect 添加长文本?

java - 缺少正文,或声明抽象 java 错误消息

java - twitter4j 配置

java - 如果程序不等待用户输入/系统资源,那么java中的线程有什么用

mysql - 长查询字符串会影响速度吗?

java - 对 netbeans 进行尸检给出 java 版本错误

mysql - 如何从sql中的 `describe`语句创建一个新表?

mysql日期与date_format的比较

java - 如何在 matteborder 中的图标周围添加空白