通过openCSV填充Javabean - 代码说明

时间:2013-06-23 10:41:25

标签: java opencsv

我刚开始使用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,它有很大的不同)

提前致谢!

1 个答案:

答案 0 :(得分:7)

这是定义如何将作为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的方法,用于设置其值。
  5. 现在;第一个方法setType获取bean的类。它使用它通过reflection创建实例。在这种情况下,我们会打电话:

    strat.setType(JavaBeanExample.class);
    

    接下来,我们假设我们有以下格式的CSV

      

    名称,订单号,订单ID
      Joe Bloggs,77777,00001
      约翰史密斯,77778,00002

    因此,我们需要将第一列映射到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);
    

    这将返回List JavaBeanExample,文件中每行一个。{/ p>

    但这有点不愉快,因为我们必须在List中投射每一项。这是因为这个例子有点过时了。下面是一个使用generics的示例,这个例子是用Java 7编写的。

    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>;即List知道其通用类型。现在我们不必在List中投射单个元素。

相关问题