因此,我正在研究一个项目(JSF2,Spring3 Core,MVC,WebFlow,Mybatis3,Richfaces和Legacy Oracle 10G)。我所有麻烦的来源与数据库的设计有关。问题在于,大多数DB表都有变化的模式(也许是不良设计?)。因此,我需要能够支持添加和删除额外的列。

为了容纳这种情况,我使MyBatis将数据拉到一个自定义的“通用”域对象中,该对象基本上只是扩展了一个hashmap。我当前的问题是更新这些hashmap对象。应该有一种使它起作用的方法,但是我似乎可以让Mybatis合作。我已经尝试使用hashmap.entryset()和mybatis,但无济于事。例如。

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

我尝试了一个自定义类型Handler,但是SetParameter()不能让我足够的访问来完成我需要的事情。一个重污染物没有给我足够的访问权,因此我也无法使用。

现在,我知道我可以做类似obj.createupdatesqlstring()之类的事情,并将其作为字面字符串插入映射器,但这有点骇客,让我对SQL注入开放。更不用说这将涉及逃脱很多字符串,并考虑到广泛的输入,除非涵盖所有可能性,否则为一些严重的错误打开了大门。

那么是否有一种既定的方法?还是至少是一个体面的方式?我听说许多铁杆Mybatis倡导者说,他们尚未遇到Mybatis无法优雅地应对的情况。因此,Mybatis专家,请帮助我!

有帮助吗?

解决方案

听起来他们试图避免使用EAV桌子。

在动态添加字段时,您必须选择毒药。从理论角度来看,EAV是好的,但在大表格上存在严重的性能问题。虽然动态添加列更适合查询性能,但您必须处理更换表接口和动态SQL。我不会直接将数据库作为不良设计。

您可能需要绕过所使用的框架。查询您的表格架构(对于Oracle查看USER_TAB_COLUMNS)并生成插入/更新脚本。参数化它们,使您免受注射。这将是头痛,但我看不到替代方案。

其他提示

Mybatis或Hibernation都用疯狂的数据库shemeas臭。我只会使用springjdbc或类似。

即使这是一个非常不错的圆形钉,也不要试图将圆形钉拟合到方孔中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top