通过openCSV填充Javabean-代码解释



我刚开始学习Java,有很多知识缺失,但我需要编写一个简单的类,将使用openCSV的csv文件转换为JavaBean。我在这里找到了一些类似问题的答案,但没有一个能帮助我。到目前为止,已经有一个代码:

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy(); 
strat.setType(YourOrderBean.class); 
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean 
strat.setColumnMapping(columns); 
CsvToBean csv = new CsvToBean(); 
List list = csv.parse(strat, yourReader);

它位于openCSV常见问题解答网站上,也在这里的另一个问题中。问题是我找不到对象ColumnPositionMappingStrategy应该是什么样子的规范,也找不到应该在strat.setType语句(YourOrder Bean.class)中传递什么。setColumnMapping方法对我来说也不重要,但我相信当我知道其余的时候,我可以自己弄清楚…

有人愿意详细解释一下这段代码吗?openCSV文档对我来说非常简短,因为我缺乏Java的一些基本知识(来自PHP,这有很大的区别)

提前感谢!

这定义了如何将CSV的一行String[]映射到JavaBean的属性。

假设您有一个class,如下所示:

public class JavaBeanExample {
    private Integer id;
    private String name;
    private Integer orderNumber;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getOrderNumber() {
        return orderNumber;
    }
    public void setOrderNumber(Integer orderNumber) {
        this.orderNumber = orderNumber;
    }
}

关于这个类需要注意的关键点是:

  1. 使用公共的noargs构造函数;这在Java中是默认的,因此不需要指定构造函数
  2. 所有财产均为私人财产
  3. 所有属性都有getter,即返回其值的名为getXxxx的方法
  4. 所有属性都有setter,即设置其值的名为setXxxx的方法

现在;第一个方法setType获取bean的类。它使用它来通过反射创建实例。在这种情况下,我们称之为:

strat.setType(JavaBeanExample.class);

接下来,让我们假设我们有一个CSV,格式如下

名称、订单号、订单Id
Joe Bloggs,77777700001
John Smith,7777800002

因此,我们需要将第一列映射到我们的name属性,第二列映射到orderNumber属性,第三列映射到id。我们使用bean中的属性名称来告诉OpenCSV要使用哪个setter。OpenCSV然后使用PropertyDescriptor通过相应命名的setter设置属性。

在这种情况下,我们将称之为

String[] columns = new String[] {"name", "orderNumber", "id"};
strat.setColumnMapping(columns); 

现在这一切都设置好了,我们可以通过调用来启动OpenCSV

List list = csv.parse(strat, yourReader);

这将返回JavaBeanExampleList,文件中的每行一个。

但这有点令人不快,因为我们必须铸造List中的每一项。这是因为这个例子有些过时了。这里有一个使用泛型的例子,这个例子是用Java7编写的。

final ColumnPositionMappingStrategy<JavaBeanExample> strategy = new ColumnPositionMappingStrategy<>();
strategy.setType(JavaBeanExample.class);
strategy.setColumnMapping(new String[]{"name", "orderNumber", "id"});
final CsvToBean<JavaBeanExample> csvToBean = new CsvToBean<>();
final List<JavaBeanExample> beanExamples;
try (final Reader reader = new FileReader("myFile.csv")) {
    beanExamples = csvToBean.parse(strategy, reader);
} catch (IOException ex) {
    throw new RuntimeException(ex);
}

这里的区别在于,我们使用尖括号告诉ColumnPositionMappingStrategy它的泛型类型。我们还告诉CsvToBean它的泛型类型。这意味着当我们调用parse时,会返回一个List<JavaBeanExample>;即知道其通用类型的CCD_ 17。现在我们不必在List中强制转换各个元素。

相关内容

  • 没有找到相关文章

最新更新