2

だから私はプロジェクト(JSF2、Spring3 Core、MVC、Webflow、MyBatis3、RichFaces、およびレガシーOracle 10g)に取り組んでいます。私のすべての問題の原因は、データベースの設計に関係しています。問題は、DB テーブルの大部分でスキーマが変更されていることです (設計が悪いのでしょうか?)。したがって、余分な列の追加と削除をサポートできる必要があります。

これに対応するために、基本的にハッシュマップを拡張するだけのカスタム「ユニバーサル」ドメイン オブジェクトに MyBatis をプルするようにしました。私の現在の問題は、これらのハッシュマップ オブジェクトを更新することです。うまくいく方法はあるはずなのですが、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';

カスタム TypeHandler を試してみましたが、setParameter() では、必要なことを行うのに十分なアクセス権が得られません。ResultHandler では個々の結果に十分にアクセスできなかったので、それも使用できませんでした。

これで、Obj.createUpdateSqlString() のようなことを実行して、リテラル文字列としてマッパーに挿入できることがわかりましたが、これはちょっとしたハックであり、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 に答える