首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JasperReport 實戰(二):Java 對象轉 XML 數據源——Betwixt 實現面向對象報表開發

     編輯:Java 相關知識

動機:告別 SQL,擁抱對象

傳統報表直連資料庫寫 SQL,缺點明顯:

  • 報表開發依賴 DBA、數據庫環境
  • 複雜計算邏輯分散在 SQL 與 Java 代碼中
  • 難以單元測試、版本控制

解決方案:Java Bean → XML (Betwixt) → JasperReport,實現純內存、面向對象、可測試的報表數據準備。

領域模型

public class Person {
    private String name;
    private String gender;
    private int age;
    // getter/setter 省略
}

public class NameList {
    private List list;
    // getter/setter
}

Betwixt 轉換工具類

import org.apache.commons.betwixt.io.BeanWriter;
import java.io.*;

public class BeanToXMLConverter {
    private static final String FILE_PATH = "c:/test.xml";

    public static void main(String[] args) throws Exception {
        // 構建對象圖
        Person p1 = new Person(); p1.setName("張三"); p1.setGender("男"); p1.setAge(35);
        Person p2 = new Person(); p2.setName("李四"); p2.setGender("女"); p2.setAge(25);
        NameList nameList = new NameList();
        nameList.setList(Arrays.asList(p1, p2));

        // 轉換並寫文件
        new BeanToXMLConverter().writeToXMLFile(nameList);
    }

    private void writeToXMLFile(Object obj) throws Exception {
        StringWriter outputWriter = new StringWriter();
        outputWriter.write("\n");

        BeanWriter beanWriter = new BeanWriter(outputWriter);
        // 配置:基本類型輸出為元素而非屬性、不生成 id、美化縮進
        beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
        beanWriter.getBindingConfiguration().setMapIDs(false);
        beanWriter.enablePrettyPrint();

        beanWriter.write(obj);  // 核心轉換

        // 寫入文件
        File xmlFile = new File(FILE_PATH);
        if (!xmlFile.exists()) xmlFile.createNewFile();
        try (FileWriter fw = new FileWriter(xmlFile)) {
            fw.write(outputWriter.toString());
        }
        System.out.println(outputWriter.toString());  // 控制台輸出預覽
    }
}

依賴坐標 (Maven)

<dependency>
    <groupId>commons-betwixt</groupId>
    <artifactId>commons-betwixt</artifactId>
    0.8
</dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils-core</artifactId>
    1.8.3
</dependency>
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    3.2.2
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    1.2
</dependency>

JDK 1.5+ (需泛型支援)

生成 XML 效果



  
    
      張三
      男
      35
    
    
      李四
      女
      25
    
  

優缺點權衡

優點缺點/關注點
面向對象開發,業務邏輯集中在 Java 代碼增加對象→XML 序列化開銷 (CPU/內存)
數據可讀、可版本控制、可單元測試大數據量時 XML 文件過大、解析慢
報表模板與數據源解耦,易於 Mock 測試Betwixt 老舊項目,現代可用 Jackson/JAXB/XStream
無需資料庫環境,適合離線/嵌入式場景複雜對象圖 (循環引用) 需額外配置

現代替代方案:Jackson XML

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    2.15.2
</dependency>

// 使用
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
String xml = xmlMapper.writeValueAsString(nameList);
// 更快、更標準、支援注解 (@JsonProperty, @JacksonXmlRootElement 等)

總結

「對象 → XML → 報表」模式讓報表開發回歸面向對象本質:業務邏輯在 Java 中完成,XML 只是中間傳遞格式。Betwixt 雖屬老牌庫,但原理通用。現代項目推薦 Jackson XML 或 JAXB 替代,性能更優、生態更活。核心思想不變:報表數據準備層與報表渲染層分離,數據源標準化為 XML/JSON。

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