2

所以我正在开发一个项目(JSF2、Spring3 Core、MVC、Webflow、MyBatis3、RichFaces 和旧版 Oracle 10g)。我所有麻烦的根源都与数据库的设计有关。问题是大多数数据库表的架构都在变化(也许设计不好?)。所以我需要能够支持额外列的添加和删除。

为了适应这一点,我让 MyBatis 将数据拉入一个自定义的“通用”域对象,该对象基本上只是扩展了一个 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';

我尝试了一个自定义 TypeHandler 但 setParameter() 没有给我足够的访问权限来做我需要的事情。ResultHandler 没有让我对每个单独的结果有足够的访问权限,所以我也不能使用它。

现在我知道我可以做一些类似 Obj.createUpdateSqlString() 的事情并将其作为文字字符串插入映射器,但这有点 hack 并且让我对 SQL 注入持开放态度。更不用说这将涉及转义大量字符串,并考虑各种可能的输入,除非涵盖所有可能性,否则会为一些严重的错误打开大门。

那么有没有既定的方法来做到这一点?或者至少是一种体面的方式?我听过一些 MyBatis 的铁杆拥护者说他们还没有遇到过 MyBatis 无法优雅处理的情况;所以MyBatis专家,请帮帮我!

4

2 回答 2

3

MyBatis 或 Hibernate 都带有疯狂的数据库方案。我只会使用 SpringJDBC 或类似的。

不要试图让一个圆钉适合方孔,即使它是一个非常好的圆钉。

于 2010-12-06T19:03:49.647 回答
1

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

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

您可能想要绕过您正在使用的框架。查询您的表模式(对于 Oracle,请查看 USER_TAB_COLUMNS)并生成插入/更新脚本。参数化它们,这样你就不会被注射。这将是一个令人头疼的问题,但我没有看到其他选择。

于 2010-12-06T20:01:58.730 回答