2010-12-06 70 views
2

因此,我正在一个项目(JSF2,Spring3核心,MVC,Webflow,MyBatis3,RichFaces和一个传统的Oracle 10g)。我所有麻烦的来源都与数据库的设计有关。问题是大多数数据库表格都有变化的模式(可能是坏设计?)。所以我需要能够支持除去额外列的&。需要帮助,使MyBatis可怕的数据库设计工作

为了适应这种情况,我使MyBatis将数据拉入了一个自定义的“通用”域对象,该对象基本上只是扩展了一个hashmap。我目前的问题是更新这些hashmap对象。应该有办法让它工作,但我似乎可以让MyBatis合作。我试过使用HashMap.entrySet()& MyBatis's,但无济于事。例如。

UPDATE MYTABLE 
SET 
<foreach collection="entries" index="i" item="entry" close="" open="" separator=", "> 
    #{entry.key} = #{entry.value} 
</foreach> 
WHERE FOO='BAR'; 

我已经尝试了自定义类型处理器,但的setParameter()不给我足够的访问做什么,我需要的。 ResultHandler没有给我足够的访问权限,所以我也不能使用它。

现在我知道我可以做一些像Obj.createUpdateSqlString()这样的东西,并将它作为一个文字字符串插入到映射器中,但这有点破解,让我打开SQL注入。更不用说,这将涉及逃避大量的字符串,并且考虑到各种可能的输入,并且除非涵盖所有可能性,这为一些严重错误打开了大门。

那么有没有一个确定的方法来做到这一点?或者至少有一半体面的方式?我听说一些铁杆MyBatis的倡导者说,他们还没有遇到MyBatis无法妥善处理的情况;所以MyBatis的专家,请帮助我!

回答

1

这听起来像他们试图避免使用EAV表。

当涉及到动态添加字段时,您必须选择您的毒药。从理论角度来看,EAV是很好的,但在大型桌子上有严重的性能问题。虽然动态添加列对查询性能更好,但您必须处理不断变化的表接口和动态SQL。我不会直接将数据库写成糟糕的设计。

你可能想绕过你正在使用的框架。查询您的表模式(Oracle查看USER_TAB_COLUMNS)并生成插入/更新脚本。对它们进行参数设置,以防止注射。这将是一个令人头疼的问题,但我没有看到替代方案。

3

MyBatis或Hibernate与疯狂的数据库模式都会发臭。我只会使用SpringJDBC或类似的。

不要试图将圆钉放入方孔中,即使它是一个非常好的圆钉。

+0

我最近得出了同样的结论,但不幸的是,MyBatis早在这个项目中就已经指定了,现在我们无法为了某些荒谬的原因而改变它(或者任何其他的库)。你不喜欢企业官僚机构吗? – Stoney 2010-12-06 20:21:30

+0

@Stoney,'不能改变'通常只是成本的一​​个函数 - 如果你真的可以向右耳证明考虑到所有成本(*所有*内部和外部依赖关系),你可以实现更小的目标你会惊讶什么可以改变。另一方面,如果现在它变得更加昂贵,你就不得不将它赶出去(另一方面,如果是官僚主义的,你的意思是你选择不这样做,因为这样的成本分析会让你处于一个糟糕的境地,因为等级,那么......那么我不会告诉你任何新东西,所以忽略整个评论) – Unreason 2010-12-06 20:33:32