我尝试将sql结果转换为csv文件 这是路线(bluprint.xml):
<route id="extractfromafbl">
<from uri="timer:foo?period=10000"/>
<to uri="sql:select * from performances?dataSource=afbl_source"/>
<to uri="bean:ngtrend.afbl2afc.transformer?method=tocsv(Exchange)"/>
<log message="${body}"/>
</route>
这是创建 csv 格式的转换器类:
public class transformer {
public void tocsv(Exchange exchange)
{
StringBuilder csv = new StringBuilder();
List received = exchange.getIn().getBody(List.class);
for (int i = 0; i < received.size(); i++)
{
Map<String,Object> row = (Map<String,Object>) received.get(i);
csv.append(row.get("id"));
csv.append(",").append(row.get("lastname"));
csv.append(",").append(row.get("firstname"));
csv.append("\r");
}
}
}
在这种情况下,我应该知道字段的名称(例如 id、lastname ...)并且我想使用索引 相反,因为表或字段可以更改。
如何使用索引而不是名称字段?
最佳答案
我知道你可以通过一些调整来使上面的代码工作,但我想我会提出一个建议,可以让整个问题对你来说更容易。 Camel SQL 组件可让您自动将数据库响应映射回对象。语法如下:
from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
完成此设置后,您将在您的 Camel 体内获得一个对象
List<MyDatabaseModel>
此时,您可以利用名为 Bindy 的驼峰组件。它会让你有一个代表 CSV 文件的对象。绑定(bind)它的方式是在数据库模型上添加一些注释,这样它也可以代表您的 csv 输出。
@CsvRecord(isOrdered = true)
public Class MyDatabaseModel{
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
...
}
对 Bindy 的调用将设置如下:
// Camel 2.15 or older (configure by package name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.myapp");
// Camel 2.16 onwards (configure by class name)
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.myapp.MyDatabaseModel.class);
.marshal(bindy)
将它们放在一起,您可以将项目分解为 2 行 Camel 和 1 个 Java 对象来完成此任务。 “下面是完整的 Camel ”
from("sql:select * from performances?dataSource=afbl_source?outputType=SelectList&outputClass=com.myapp.MyDatabaseModel")
.marshal(bindy);
我想我还应该提到,如果您不想过多担心 csv 顺序的配置,您实际上可以跳过整个注释过程,只需执行以下操作:
marshal().csv();
关于java - Apache Camel - SQL 到 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654466/