3

我有两种方法可以从 CSV 中提取数据

private Car processCar (String [] row) {
    Car c = new Car();
    c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
    ....
    return c;
}

private Driver processDriver(String[] row) {
    Driver d = new Driver(row[CSVColumns.name.index]);
    sys.setAge(row[CSVColumns.age.index]);
    ...
    return d;
}

现在,在从数据库中提取数据时,我需要再次使用这两种方法,但是只需稍作改动

private Car processCar (ResultSet rs) {
    Car c = new Car();
    c.setCarId(rs.getInt("Id"));
    ....
    return c;
}

private Driver processDriver(ResultSet) {
    Driver d = new Driver(rs.getString("Name));
    sys.setAge(rs.getString("Age"));
    .....
    return d;
}

有没有办法简化这一点,这样我就不必重复自己了?此外,每种方法都包含很多 getter/setter,所以我不想复制粘贴的东西并进行更改......

4

4 回答 4

1

一种选择是编写一个方法,该方法接受一个结果集并转换为返回一个字符串数组。根据您的数据库库,这可能主要是内置的。所以您创建类似

String[] ResultSetToStrings(ResultSet aResultSet)

然后你的电话看起来像

processCar(["1994","Ford","Probe","etc"]);

或者

processCar(ResultSetToStrings(aResultSet));

并且您丢弃了代码的 ResultSet 版本。

这可能会导致一些效率损失(可能可以忽略不计 - 转换为 CSV 所花费的时间和一些额外的字符串操作)。还要确保您的 CSV 以正确的顺序出现(可能需要在 SQL 查询中明确说明列名和顺序,或者在转换例程中查阅 CSVColumns 对象)并处理多行、空格、逗号等内容在字段值等中

反过来也可能有效 - 将您的 String[] 更改为结果集。事实上,同样取决于您的数据库驱动程序,这可能是内置的。

于 2012-10-31T20:19:48.400 回答
1

抽象数据源和使用通用接口

这个想法是有一个通用适配器,可以将ResultSetCSV 或 CSV 转换为一致接口后面的通用内容:

interface CarDataSource {

    getCarId();
    //...

}

和两个实现:

class CsvDataSource implements CarDataSource {

    private final String[] row;

    public CsvDataSource(String[] row) {
        this.row = row;
    }

    public int getCarId() {
        return Integer.parseInt(row[CSVColumns.carid.index]);
    }

    //...

}

class ResultSetDataSource implements CarDataSource {

    private final ResultSet rs;

    public ResultSetDataSource(ResultSet rs) {
        this.rs = rs;
    }

    public int getCarId() {
        return Integer.parseInt(rs.getString("Name));
    }

    //...

}

这就是你使用它的方式:

private Car processCar(CarDataSource s) {
    Car c = new Car();
    c.setCarId(s.getCarId());
    ....
    return c;
}

提供new CsvDataSource()new ResultSetDataSource()

具有两种实现的抽象工厂:

非常相似的方法,创建和抽象工厂:

interface CarFactory {

    Car create();

}

有两种实现:

class CsvCarFactory implements CarFactory {

    private final String[] row;

    public CsvDataSource(String[] row) {
        this.row = row;
    }

    public Car create() {
        Car c = new Car();
        c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
        //...
        return c;
    }

}

class ResultSetCarFactory implements CarDataSource {

    private final ResultSet rs;

    public ResultSetCarFactory(ResultSet rs) {
        this.rs = rs;
    }

    public Car create() {
        Car c = new Car();
        c.setCarId(rs.getInt("Id"));
        //...
        return c;
    }

    //...

}

组合

我不喜欢上述任何一种方法,因为它们引入了很多样板文件而没有增加太多价值。但第一种方法是有希望的,一旦你减少它。

只有一个processCar()作为String[]论据。但是,如果您有ResultSet,只需将其首先转换为String[],将列提取到数组中的后续项目中:

public String[] toStringArray(ResultSet rs)

另一个方向的翻译,即ResultSet基本格式也是可能的,但ResultSet单独实现要困难得多。

于 2012-10-31T20:21:43.557 回答
0

另一种可以简化程序方面的方法:

private Car processCar (String [] row) {
    return new Car(Integer.parseInt(row[CSVColumns.carid.index]));
}

private Driver processDriver(String[] row) {
     return new Driver(row[CSVColumns.name.index], row[CSVColumns.age.index]);
}

尽管您通常会通过使用比字符串更独特的类型来使您的生活更轻松,但允许它们与字符串表示形式相互转换。然后,您的解析器可以支持从 CSV 输入创建这些特殊类型。因此,添加类型安全也可以在很大程度上消除冗余并使其更易于维护。

于 2012-10-31T20:23:35.973 回答
0

一种解决方案可能是使用Adapter接口。


interface ParamAdapter {
    int getCarID();
    //...
}

class ResultSetParamAdapter implements ParamAdapter {

    private final ResultSet rs;

    public ResultSetParamAdapter(ResultSet rs) {
       this.rs = rs;
    }

    public int getCarID() {
        return rs.getInt("Id");
    }

    //...
}

class StringArrayParamAdapter implements ParamAdapter {

    private String[] array;

    public ResultSetParamAdapter(String[] array) {
       this.array = array;
    }

    public int getCarID() {
        return Integer.parseInt(array[CSVColumns.carid.index]);
    }

    //...
}

这三个点是您可能需要的其他方法。

于 2012-10-31T20:28:25.730 回答