2010-12-06 8 views
2

私はプロジェクト(JSF2、Spring3 Core、MVC、Webflow、MyBatis3、RichFaces、およびOracle 10g)で作業しています。すべてのトラブルの原因は、データベースの設計と関係しています。問題は、大部分のDBテーブルがスキーマを変更していることです(おそらく、悪い設計ですか?)。だから私は余分な列の追加&の削除をサポートできるようにする必要があります。MyBatisがひどいデータベース設計で動作するように助けが必要

これに対応するため、MyBatisは基本的にハッシュマップを拡張する独自の「ユニバーサル」ドメインオブジェクトにデータをプルしました。私の現在の問題は、これらのハッシュマップオブジェクトの更新です。それを機能させる方法があるはずですが、私は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()のようなことができ、リッパー文字列としてマッパーに挿入できることはわかっていますが、ちょっとハックしてSQLインジェクションを開いてしまいます。言うまでもなく、たくさんの文字列をエスケープし、可能な入力の幅を広げ、すべての可能性がカバーされていない限り、いくつかの深刻なバグを発見することはありません。

これを行うための確立された方法はありますか?またはatleast途中でまともな方法? MyBatisの主張者たちは、MyBatisがうまく処理できない状況にまだ遭遇していないと言います。だからMyBatisの専門家は、私を助けてください!

答えて

1

EAVテーブルの使用を避けようとしていたようです。

フィールドを動的に追加するには、毒を選択する必要があります。 EAVは理論的には良いですが、大きなテーブルでは重大なパフォーマンス上の問題があります。動的に列を追加するとクエリのパフォーマンスが向上しますが、変更するテーブルインターフェイスと動的SQLを処理する必要があります。私は悪いデザインとしてデータベースを完全に書いていません。

使用しているフレームワークをバイパスしたい場合があります。テーブルスキーマ(Oracleの場合はUSER_TAB_COLUMNS)を照会し、挿入/更新スクリプトを生成します。それらをパラメータ化して、注射から安全です。それは頭痛になるでしょうが、私には選択肢はありません。

+0

洞察力ありがとう。可変スキーマは常に悪い印象を受けていましたが、このデータベースがうまく設計されていないという評判が得られた理由は他にもたくさんあります。私はちょうどそれをハッキングするのではなく、組み込みのマッパーを使用することを避けなければならないと思います。クエリをパラメータ化することが私の主な関心事でしたが、それを見て、MyBatisを少なくともその部分に利用できるかもしれないと思います。再度、感謝します! – Stoney

+0

一般的には避けてください。実行時に列が追加された場合、エンドユーザーは表を設計しており、正規化ルールに違反している可能性があります。しかし、アプリケーションが実行時にフィールドを追加する必要がある場合は、何かをしなければならず、EAV、ホルダーカラム、または動的にカラムを追加することが必要です。 – mike

+0

エンドユーザーが設計者であるため、データベースが「設計が不適切であるという評判」があるかもしれない1つの理由があります。エンドユーザーは、Phone1、phone2、... phone322のような列の追加を開始することがあります。ユーザーがテーブルを設計することで、それらをデザイナーにすることができます。エンドユーザーアプリケーションは、SQLDeveloperのような開発ツールになり始めます。 – mike

3

MyBatisまたはHibernateは、狂ったデータベーススキームで悪臭を放つ。私はSpringJDBCなどを使用します。

本当に素敵な丸いペグであっても、四角い穴に丸いペグをフィットさせないでください。

+0

私は最近同じ結論に達しましたが、残念なことにMyBatisはこのプロジェクトの初期段階で仕様化されていたため、いくつかの無意識の理由でMyBatisを変更できませんでした。あなたは企業の官僚主義を愛していないのですか? – Stoney

+0

@Stoney、 '変更できません'は通常コストの関数です - すべてのコストを考慮して(すべての内部と外部の依存関係)、より小さな目標を達成するあなたが変えることができるものに驚かされるでしょう。一方、現時点では、現実には変わるのは本当に高価ですが、それを乗り越えなければならないでしょう(他方では、官僚主義であれば、そうしたコスト分析では階層、よく...その後、私はあなたに何か新しいことを教えていないので、全体のコメントを無視してください) – Unreason

+0

それを変更する方法があります、ちょうどあなたが戦うために喜んでいる方法に依存します:) – bwawok

関連する問題