Java:哪种结构方法更好

时间:2012-02-27 02:58:01

标签: java

我对Java没有太多的了解,所以我想知道是否有人能够让我了解构建这个应用程序的最佳方法(或者是否重要)。

我有一种情况,我从平面文件中提取数据并将其提交到SQL数据库。但是,我使用的特定预准备语句取决于文件扩展名。

基本上

  1. 程序检查文件扩展名。
  2. 打开文件,创建缓冲读卡器 - 读取字符串数据。
  3. 基于文件扩展名,生成预准备语句。
  4. 将准备好的声明添加到批处理列表。
  5. 重复文件中的每一行(可能有数千行)。
  6. 执行准备好的陈述。
  7. 我确定如何从文件扩展名到适当的预处理语句的方式是Map(它从一堆中调用相关方法,它们都实现了相同的接口)。

    我有两种方法可以实现这一点。

    1. 将连接和缓冲的阅读器传递给适当的方法,它将完成所有工作(生成数千个预准备语句并执行它们。该方法返回'void')。

    2. 将行的连接和字符串传递给适当的方法。该方法返回准备好的语句。原始应用程序生成另一个字符串(下一行),将其传递给返回预准备语句的方法,等等......直到原始应用程序执行所有准备好的语句。

    3. 基本上,选项编号1需要更多代码,选项编号2需要数千个方法调用。

      哦,重要的是要注意每个方法调用都是有条件的,基于使用“.equals()”方法根据地图中的相应键检查字符串。

      感谢。

3 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

PreparedStatement prepareStatement(String line, File f);
void executeBatchUpdate(List<PreparedStatement> ps);

main(){
    List<PreparedStatement> myStatements; //initialize as you like
    Collection<File> myFiles; //initialize as you like
    for(File f : myFiles){ 
        BufferedReader br = new BufferedReader(new FileInputStream(.....
        while(br.hasNextLine()){
            myStatements.add(prepareStatement(br.readLine(), f));
        }
    }
    executeBatchUpdate(myStatements, f);
}

通过查看main方法可以很容易地理解程序流程,其他部分可以完成相对简单的任务。

编辑反映在准备语句时应该有文件元数据,并考虑到有多个文件需要处理的可能性。

使用switch并根据需要处理每种文件类型并不是非常昂贵。或者,如果您有这么多不同的文件类型,通过switch案例进行线性搜索会很昂贵,那么您可以初始化一个允许进行常量查找的HashMap。

答案 1 :(得分:1)

我建议您为每种文件类型编写一个类,让该类处理该处理。然后,如果必须添加不遵循严格行的插入语句语义的文件类型,则破坏程序的风险会降低。这有点像选项#1,但它将来可以提供更大的灵活性。

答案 2 :(得分:1)

我会说选项2最接近。利用面向对象的设计来仅抽象文件扩展名之间不同的功能 - 尝试将所有共同点发生在一个地方。

例如,您的Map可以存储带有String并返回PreparedStatement的对象,并且每个文件扩展名都会有其中一个。当然,这样的对象也需要引用Connection才能这样做 - 当它首次被初始化和存储时,可能会将它传递给它的构造函数,假设你为所有东西使用相同的数据库连接。