如何在Java中传递参数给SQL查询以生成Jasper Report
Java传递参数到Jasper Report的SQL查询(subDataset场景)
完全可以实现从Java代码传递参数到Jasper Report的SQL查询,下面是具体的修改步骤和代码示例:
1. 修改JRXML中的subDataset配置
需要先在subDataset里定义参数,然后在SQL查询中引用这个参数:
<subDataset name="userDataset" uuid="b277feac-f289-4d08-83ad-06eb2f992cb7"> <property name="com.jaspersoft.studio.data.sql.tables" value=""/> <property name="com.jaspersoft.studio.data.defaultdataadapter" value="userAdapater"/> <!-- 定义参数,参数名与后续Java代码传入的key一致,类型对应Java的String --> <parameter name="CityParam" class="java.lang.String"/> <queryString language="SQL"> <![CDATA[SELECT * FROM users where city = $P{CityParam}]]> </queryString> </subDataset>
说明:$P{参数名}是Jasper Report的参数引用语法,会自动处理SQL注入问题,比直接拼接字符串更安全。
2. Java代码中传递参数并生成报表
在Java代码里,把参数放入Map中,再传递给报表填充方法:
import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.export.SimpleExporterInput; import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.util.HashMap; import java.util.Map; public class JasperReportGenerator { public static void main(String[] args) { try { // 加载JRXML报表文件 File reportFile = new File("path/to/your/report.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(reportFile.getAbsolutePath()); // 准备要传递的参数 Map<String, Object> parameters = new HashMap<>(); // 参数名必须和JRXML中定义的一致 parameters.put("CityParam", "Washington"); // 获取MySQL数据库连接(替换为你的实际配置) String dbUrl = "jdbc:mysql://localhost:3306/your_database"; String dbUser = "your_db_user"; String dbPwd = "your_db_password"; Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd); // 填充报表 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn); // 导出为PDF示例 JRPdfExporter exporter = new JRPdfExporter(); exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("output/report.pdf")); exporter.exportReport(); // 关闭资源 conn.close(); System.out.println("报表生成完成!"); } catch (Exception e) { e.printStackTrace(); } } }
额外注意事项
如果你的主报表是通过datasetRun引用这个subDataset,需要在datasetRun标签中传递参数,确保主报表参数能传递到subDataset:
<datasetRun subDataset="userDataset" uuid="..."> <datasetParameter name="CityParam"> <datasetParameterExpression><![CDATA[$P{CityParam}]]></datasetParameterExpression> </datasetParameter> </datasetRun>
内容的提问来源于stack exchange,提问作者Takue
相关产品推荐
相关产品推荐

