在我的项目中,我需要在运行时在数据库之间切换。我试图使用Hibernate,但卡在一个地方,我需要用数据库中的表映射对象。问题是,我有几个带前缀的表:documents2001,documents2002 ......据我所知,我无法在运行时使用表映射类。我尝试使用iBatis,但问题是在运行时期间数据库更改。在iBatis中,这很难做到。\
也许有些建议,我该怎么用?
我的要求:
更新
好的,我会试着解释一下:
我必须编写应用程序,它可以在运行时连接到不同的数据库。 app的用户可以选择,连接哪个数据库。所有数据库都具有相同的结构。除此之外,用户还可以在数据库中的表之间切换。表格具有相同的结构。
也许还有其他可以使用的工具?
答案 0 :(得分:11)
在Ibatis中使用动态表名是微不足道的。只需使用以下表达式:
SELECT * FROM $tableName$
其中tableName
是参数类的属性。
如果不是不切实际(甚至不可能),在Hibernate(或任何JPA提供程序)中使用动态表名称是非常困难的。之前提出过这个问题。请参阅JPA: How do I specify the table name corresponding to a class at runtime?。
在Ibatis中使用动态数据源需要您编写一些代码但不是那么多。基本上,Ibatis围绕sqlMapClient
的概念工作,它具有数据源和可以运行的查询列表。只需为每个数据库创建一个sqlMapClient
,每个数据库都有不同的数据源,并让它们包含所有相同的查询文件(在sql map配置中)。
可以编写DAO,使其注入多个sqlMapClients
,并选择在运行时使用哪一个。这是你必须自己编写的部分,但它很简单。
这是基于在编译时知道数据库。如果直到运行时才知道数据库,那就更难了。它可能仍然有可能,但我不确定如果您基本上在sqlMapClient
运行时交换数据源,Ibatis将如何反应。它可能会起作用,它可能会爆炸。你必须尝试看看。
Hibernate也可以按照相同的原则工作:将多个持久性单元注入DAO并在运行时使用正确的单元。使用Hibernate(或任何JPA提供程序),您必须注意确保托管对象存储在正确的持久性单元中。我很容易看到这实际上变成了一场噩梦。
一般性评论:建议不要走动态表名或数据库的路径,以便真正考虑你正在做什么以及为什么要问自己是否可以通过做出更好的设计选择来解决这个问题。
答案 1 :(得分:1)
表格是否具有相同的结构,只是名称不同?
这绝对可以在iBATIS中进行映射。
您只需在SQL Map中包含类似的内容:
<select id="selectAll" resultMap="result" parameterClass="myParameterClass">
SELECT ColumnA, ColumnB FROM $tableName$
</select>
假设我已正确理解你的问题,那应该可以解决你的问题。
答案 2 :(得分:1)
我不完全理解你的要求,但这是可能的:
Hibernate和iBatis都可以在DataSource中工作,因此您可以创建自己的javax.sql.DataSource实现,每次调用getConnection()时都会返回不同的连接。