Java程序应该支持多个数据库和变量输入

Java程序应该支持多个数据库和变量输入,java,database,hibernate,Java,Database,Hibernate,我现在正在编写一个Java程序,它读取文件并将这些文件的内容(经过一些修改)写入关系数据库 我现在的问题是,这个程序应该支持广泛的数据库,而不仅仅是一个 因此,在我的程序中,我创建SQL语句并将它们提交给DB—没问题。(SAP HANA) 现在我想添加另一个DB(MySQL),并且在提交之前必须稍微更改查询的SQL语法 我现在的解决方案是复制代码块,这将创建语句并对其进行特定于DB的更改。但这显然不可能。(对于许多数据库->80%的代码从未使用过)我可能需要某种映射器,将我的sql转换为所选数据

我现在正在编写一个Java程序,它读取文件并将这些文件的内容(经过一些修改)写入关系数据库

我现在的问题是,这个程序应该支持广泛的数据库,而不仅仅是一个

因此,在我的程序中,我创建SQL语句并将它们提交给DB—没问题。(SAP HANA) 现在我想添加另一个DB(MySQL),并且在提交之前必须稍微更改查询的SQL语法

我现在的解决方案是复制代码块,这将创建语句并对其进行特定于DB的更改。但这显然不可能。(对于许多数据库->80%的代码从未使用过)我可能需要某种映射器,将我的sql转换为所选数据库能够理解的方言

现在,我发现了Hibernate和其他映射程序,但我认为它们不适合我的需要。问题是他们需要一个java对象(pojo)并将其转换。但是因为我不知道我的程序将加载什么样的数据,所以我不能为每一列创建静态对象

有时我需要创建4列,有时需要创建10列。有时是整数,有时是字符串/varchar。一直以来,他们都有不同的名字。所以我在hibernate上找到的所有教程都是从一个点开始的,在这个点上,程序可以确定什么样的数据将被插入到数据库中,而我的程序不是。 此外,我需要在每个表中插入大量行(如十亿行以上),我认为为每个插入创建对象可能会很慢

我希望任何人都能理解我的问题,并能给我一些提示。也许是一个映射程序,它只转换sql而不需要在之前创建对象

非常感谢!:)


编辑:为了更清楚:该程序的目的是用存储/描述在csv和xml等文件中的数据填充关系数据库。因此,数据库不是用来存储数据的工具,而是存储数据的主要目的。我需要一个由用户提供的数据填充的实时数据库。不仅是一个数据库,还有各种各样的RDB,我认为您描述的是文件系统的完美用途。或者,如果您想使用文件系统抽象:


看一看ApacheJackrabbit项目

那么基本上您想编写一个工具,将任意文本文件(我假设是某种csv)写入任意数据库系统?根据文本平铺的结构动态创建表和内容

使用hibernate这样的高级抽象层不会很快带你去任何地方。您想要做的是低级别的数据库交互。只要您不需要任何特定的依赖于DBMS的特性,就应该使用ANSI sql。如果这还不够的话,我看不出一个简单的解决办法。也许可以选择编写自己的抽象层来处理特定于DBMS的SQL语句格式化。听起来不太好


另一个需要考虑的问题是
每个表有大量的行(如十亿行以上)
。使用单行
INSERT
语句不是一个好主意。您必须使用高效的海量数据接口,这些接口强烈依赖于DBMS!事先准备好的报表是这里最不重要的衡量标准。

我对这个问题的理解是:没有业务方面。谢谢你的回答。我认为我在描述我的程序的目的时做得很糟糕:我想将一些文件(csv、xml)中的数据插入到几个关系数据库中。所以在我看来,杰克拉比特在这里对我没有帮助。因为目标不是以某种方式存储数据,而是用它填充关系数据库。因此,填充数据库是目的,而不是工具。我希望这有助于理解,您可以在运行时使用反射创建对象;如果您处理的是超过10亿行,那么额外的开销不会有问题。不过,我当时的问题是:您的后端数据库也是动态的吗?为什么你认为你需要这个功能?通常,当您达到完全生产规模的dbs时,基本设计已经锁定(出于多种原因)。我完全希望有一个库可以为您做到这一点,甚至可能有一个库可以与Hibernate(或其他映射程序之一)对话/使用Hibernate。我动态创建表格。如果这就是你所说的动态。我对这个很陌生…嘿,在十亿行中,你不只是想盲目地创建一个新的db,这会杀死你/你的系统。当数据库达到该大小时,数据库实际存储数据的位置/方式变得非常重要(SQL本身主要从查询中提取数据,但在后端可能很重要)。大多数系统还具有(特定于RDBMS的)
LOAD
实用程序-这会跳过
INSERT
s,但通常要求已经创建了表。除了通过JDBC写入数据库外,程序还支持导出csv文件以加载到数据库中。因此,在这种情况下,程序只创建表,但插入是由rdbms的批量加载程序完成的。遗憾的是,这不是所有rdbms的选项,因此也需要JDBC方式:(谢谢!您确实理解我的意图。我创建表并动态填充它们。依赖于程序读取的文件。(csv,主要是xml)我现在正在使用批插入,这比单独提交每个插入要快得多。我将检查ansi sql。可能包含一些对ansi sql有用的提示。