3

在我的项目中,我需要在运行时在数据库之间切换。我尝试使用 Hibernate,但卡在了一个地方,我需要将对象与数据库中的表进行映射。问题是,我有几个带有前缀的表:documents2001,documents2002 ...据我所知,我无法在运行时将类与表映射。我尝试使用 iBatis,但问题在于运行时更改数据库。在 iBatis 中,这很难做到。\

也许一些建议,我应该使用什么?

我的要求:

  • 能够在运行时连接到不同的数据库
  • 能够在运行时更改表(如果类映射到表,就像在 Hibernate 中一样)。

更新: 好的,我会尝试解释:
我必须编写应用程序,它可以在运行时连接到不同的数据库。应用程序的用户可以选择要连接的数据库。所有数据库都具有相同的结构。除此之外,用户可以在数据库中的表之间切换。表具有相同的结构。

  • 为什么我假设,我不能使用 Hibernate:在 Hibernate 中,类与表映射,所以我不能在运行时更改表。这不允许我选择可以连接的表。
  • 为什么我假设,我不能使用 iBATIS。在 iBATIS 中,在运行时很难连接到不同的数据库。因此,用户将无法在运行时连接到不同的数据库。

也许我可以使用另一种工具?

4

3 回答 3

12

在 Ibatis 中使用动态表名是微不足道的。只需使用如下表达式:

SELECT * FROM $tableName$

wheretableName是参数类的属性。

在 Hibernate(或任何 JPA 提供程序)中使用动态表名即使不是不切实际(甚至不可能)也是非常困难的。这个问题以前就提出过。请参阅JPA:如何在运行时指定与类对应的表名?.

在 Ibatis 中使用动态数据源将需要您编写一些代码,但不是那么多。基本上,Ibatis 围绕 a 的概念工作sqlMapClient,它有一个数据源和一个可以运行的查询列表。只需sqlMapClient为每个数据库创建一个,每个数据库都有不同的数据源,并让它们包含所有相同的查询文件(在 sql map 配置中)。

可以编写一个 DAO,使其具有多个sqlMapClients注入,并在运行时选择使用哪一个。这是您必须自己编写的部分,但它很简单。

这是基于在编译时了解数据库的。如果数据库直到运行时才知道,那么这有点困难。它可能仍然是可能的,但我不确定如果你基本上在运行时从sqlMapClient. 它可能会起作用,它可能会爆炸。你得试试看。

Hibernate 也可以按照相同的原则在这里工作:您将多个持久性单元注入 DAO 并在运行时使用正确的一个。使用 Hibernate(或任何 JPA 提供程序),您必须注意确保您的托管对象存储在正确的持久性单元中。我很容易看到这实际上变成了一场噩梦。

一个普遍的评论:不建议走动态表名或数据库的路径,所以要真正考虑一下你在做什么以及为什么要问自己是否可以通过做出一些更好的设计选择来解决这个问题。

于 2009-11-17T09:19:07.500 回答
1

这些表是否具有相同的结构,只是名称不同?

这绝对可以在 iBATIS 中进行映射。

您只需要在 SQL 映射中包含类似的内容:

<select id="selectAll" resultMap="result" parameterClass="myParameterClass">
    SELECT ColumnA, ColumnB FROM $tableName$
</select>

假设我正确理解了您的问题,那应该可以解决您的问题。

于 2009-11-17T08:50:27.777 回答
1

我不完全理解您的要求,但这是一种可能性:

Hibernate 和 iBatis 都可以从 DataSource 工作,因此您可以创建自己的 javax.sql.DataSource 实现,每次调用 getConnection() 时返回不同的连接。

在 Hibernate 中使用数据源

于 2009-11-17T09:06:08.890 回答