开发报表文件保存数据库
目前报表文件默认时保存到服务器文件系统中,如果需要将报表文件持久化到数据库可自定义开发文件保存器。
1、开发
在开发时需要实现 `ReportStoreProvider` 接口,以下为代码示例/**
* @author march
* @Date: 2024年06月20日
* Description:
*/
@Component // 需注入Bean容器
public class CustomDatabaseProvider implements ReportStoreProvider {
/**
* 此处为伪代码,根据自己项目实际清空获取数据源
*/
private final NamedParameterJdbcTemplate jdbcTemplate;
/**
* @param dataSource 由 Spring Bean 注入
*/
public CustomDatabaseProvider(DataSource dataSource) {
jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
@Override
public InputStream loadReport(String fileName) {
if (!fileName.endsWith(".json")) {
fileName += ".json";
}
final String SQL = "SELECT content FROM report WHERE name = :name";
String content = jdbcTemplate.queryForObject(SQL, new MapSqlParameterSource("name", fileName), String.class);
if (content == null) {
content = "";
}
return new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
}
@Override
public void deleteReport(String fileName) {
final String SQL = "DELETE FROM report WHERE name = :name";
jdbcTemplate.update(SQL, new MapSqlParameterSource("name", fileName));
}
@Override
public List<ReportFile> getReportFiles() {
final String SQL = "SELECT name, create_time FROM report ORDER BY name ASC";
List<Map<String, Object>> reportList = jdbcTemplate.queryForList(SQL, new MapSqlParameterSource());
List<ReportFile> reportFiles = new ArrayList<>();
for (Map<String, Object> fileInfo : reportList) {
String name = (String) fileInfo.get("name");
Date createTime = (Date) fileInfo.get("create_time");
ReportFile reportFile = new ReportFile(name, createTime);
reportFiles.add(reportFile);
}
return reportFiles;
}
@Override
public void saveReport(String fileName, String content) {
// 保存报表的 fileName 参数带 .json 后缀
final String SQL = "INSERT INTO report (id, name, content, create_time) VALUES (null, :name, :content, now())";
MapSqlParameterSource parameter = new MapSqlParameterSource()
.addValue("name", fileName)
.addValue("content", content);
jdbcTemplate.update(SQL, parameter);
}
@Override
public String getName() {
return "数据库存储";
}
@Override
public boolean enable() {
return true;
}
@Override
public String fileSign() {
// 自定义文件储存器标识
return "DATABASE";
}
}