我对Java没有太多的了解,所以我想知道是否有人能够让我了解构建这个应用程序的最佳方法(或者是否重要)。
我有一种情况,我从平面文件中提取数据并将其提交到SQL数据库。但是,我使用的特定预准备语句取决于文件扩展名。
我确定如何从文件扩展名到适当的预处理语句的方式是Map(它从一堆中调用相关方法,它们都实现了相同的接口)。
我有两种方法可以实现这一点。
将连接和缓冲的阅读器传递给适当的方法,它将完成所有工作(生成数千个预准备语句并执行它们。该方法返回'void')。
将行的连接和字符串传递给适当的方法。该方法返回准备好的语句。原始应用程序生成另一个字符串(下一行),将其传递给返回预准备语句的方法,等等......直到原始应用程序执行所有准备好的语句。
基本上,选项编号1需要更多代码,选项编号2需要数千个方法调用。
哦,重要的是要注意每个方法调用都是有条件的,基于使用“.equals()”方法根据地图中的相应键检查字符串。
感谢。
答案 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
才能这样做 - 当它首次被初始化和存储时,可能会将它传递给它的构造函数,假设你为所有东西使用相同的数据库连接。