首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

FineReport 實現報表動態列展示:基於 MySQL information_schema 元數據驅動

     編輯:MySQL 綜合教學

FineReport 實現報表動態列展示:基於 MySQL information_schema 元數據驅動

報表開發中常遇到「列動態顯示」需求:用戶勾選字段,報表即時調整列結構。傳統方案通過隱藏列、條件格式等繞路實現,不僅代碼冗余,大數據量下性能更差。本文介紹利用 MySQL information_schema 系統庫動態獲取表結構,配合帆軟 FineReport 參數化查詢,實現真正的動態列渲染。

一、核心原理:information_schema 介紹

information_schema 是 MySQL 內建的元數據庫,提供數據庫對象的結構信息,本質是一系列系統視圖。核心表如下:

表名用途對應 SHOW 命令
SCHEMATA所有數據庫信息SHOW DATABASES
TABLES表/視圖信息(引擎、行數、創建時間)SHOW TABLES
COLUMNS列信息(類型、長度、默認值、註釋)SHOW COLUMNS
STATISTICS索引信息SHOW INDEX
KEY_COLUMN_USAGE約束鍵列-

二、常用元數據查詢示例

-- 1. 查看某庫所有表行數
SELECT TABLE_NAME, TABLE_ROWS 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'reporttest' 
ORDER BY TABLE_ROWS DESC;

-- 2. 查看庫佔用空間
SELECT 
  CONCAT(ROUND(SUM(DATA_LENGTH)/1024/1024,2),' MB') AS data_size,
  CONCAT(ROUND(SUM(INDEX_LENGTH)/1024/1024,2),' MB') AS index_size
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'reporttest';

-- 3. 獲取指定表所有列名(動態列核心)
SELECT COLUMN_NAME, COLUMN_COMMENT, DATA_TYPE, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'reporttest' AND TABLE_NAME = 'report'
ORDER BY ORDINAL_POSITION;

三、FineReport 實現步驟

1. 準備測試數據

CREATE DATABASE reporttest;
USE reporttest;
CREATE TABLE report (
  id INT PRIMARY KEY AUTO_INCREMENT,
  dept VARCHAR(20),
  product VARCHAR(30),
  sales DECIMAL(10,2),
  profit DECIMAL(10,2),
  region VARCHAR(20),
  sale_date DATE
);
INSERT INTO report VALUES 
(1,'華東','筆記本',12000,3000,'上海','2023-01-01'),
(2,'華南','手機',8000,2000,'深圳','2023-01-02');

2. 設計器建立數據連接

FineReport 設計器 → 數據連接 → 新增 → 選擇 MySQL → 填寫 host/port/db/user/pass → 測試成功 → 保存為 test。

3. 創建動態列參數

  • 參數面板 → 新增參數 sel_cols,類型「多選下拉框」
  • 數據字典 → 綁定 SQL:SELECT COLUMN_NAME, COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='reporttest' AND TABLE_NAME='report'
  • 默認值可預選 dept,product,sales

4. 主查詢 SQL 動態拼接

-- FineReport 支持 ${參數} 語法直接嵌入
SELECT ${sel_cols} FROM reporttest.report WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31';

關鍵點:FineReport 會在預覽/導出前解析參數,將多選值以逗號拼接為合法列列表,實現真正的列級動態查詢,而非全查後前端隱藏。

5. 處理「無選擇」邊界情況

-- 使用 CASE WHEN 或 IFNULL 兜底
SELECT IFNULL(NULLIF(TRIM(${sel_cols}),''), 'id') FROM reporttest.report ...

四、進階擴展:動態列 + 動態條件 + 動態排序

同理可建立 where_cols、order_cols 參數,綁定同樣的 COLUMNS 元數據,構建完全用戶自定義的報表查詢面板。

五、其他數據庫適配

  • Oracle:ALL_TAB_COLUMNS / USER_TAB_COLUMNS
  • SQL Server:INFORMATION_SCHEMA.COLUMNS(語法一致)
  • PostgreSQL:information_schema.columns
  • DB2:SYSIBM.SYSCOLUMNS

六、總結

利用 information_schema.COLUMNS 獲取表結構元數據,配合 FineReport 參數化查詢機制,可零硬編碼實現報表列的完全動態展示。此方案查詢層面真正做到「只查所需列」,大幅降低網絡傳輸與內存壓力,適配千萬級數據量報表場景。核心優勢在於:元數據驅動、前後端解耦、可擴展至條件/排序/分組全維度動態化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved