2010-12-06 67 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