我正在尝试在 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 DbUtils 或 this 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 TableModel和 JideSoft TransposeTableModel 。 TransposeTableModel
的代码可能类似于以下内容...
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/