マイバティスがひどいデータベースデザインで動作するようにするのに役立つ必要があります
質問
そこで、私はプロジェクト(JSF2、Spring3 Core、MVC、Webflow、MyBatis3、Richfaces、およびLegacy Oracle 10G)に取り組んでいます。私のすべてのトラブルのソースは、データベースの設計に関係しています。問題は、DBテーブルの大部分が変化するスキーマを持っていることです(おそらく悪いデザイン?)。したがって、追加の列の追加と削除をサポートできる必要があります。
これに対応するために、MyBatisを基本的にハッシュマップを拡張するだけのカスタム「ユニバーサル」ドメインオブジェクトに引き込みました。私の現在の問題は、これらの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';
カスタムタイプハンドラーを試しましたが、SetParameter()は必要なことを行うのに十分なアクセスを提供しません。 Resulthandlerは、個々の結果ごとに十分なアクセスを提供しなかったので、私もそれを使用できませんでした。
今、私はobj.createupdatesQlString()のようなことをして、文字通りの文字列としてマッパーに挿入できることを知っていますが、それは少しハックであり、SQLインジェクションに開かれたままになります。言うまでもなく、それは多くの文字列を逃がし、幅広い可能な入力を考慮し、いくつかの深刻なバグのドアを開ける可能性がすべてカバーされない限り。
それで、これを行うための確立された方法はありますか?または、少なくとも半分のまともな方法ですか? Mybatisが優雅に処理できない状況にまだ遭遇していないと言っている多くの筋金入りのMybatisの支持者が聞いたことがあります。だからMyBatisの専門家、私を助けてください!!
解決
EAVテーブルの使用を避けようとしているようです。
動的にフィールドを追加することになると、毒を選ぶ必要があります。 EAVは理論の観点からは優れていますが、大きなテーブルで深刻なパフォーマンスの問題があります。列を動的に追加する方がクエリのパフォーマンスに適していますが、変化するテーブルインターフェイスと動的SQLを処理する必要があります。私はデータベースを悪いデザインとして完全に書き留めることはありません。
使用しているフレームワークをバイパスすることをお勧めします。テーブルスキーマ(Oracleの場合はuser_tab_columnsを見てください)をクエリし、挿入/更新スクリプトを生成します。それらをパラメーター化して、注射から安全になります。それは頭痛になりますが、私には代替手段がありません。
他のヒント
MyBatisまたはHibernateは、どちらもクレイジーなデータベーススキームで悪臭を放ちます。 SpringJDBCなどを使用するだけです。
たとえそれが本当に素敵な丸いペグであっても、丸いペグを四角い穴にフィットさせようとしないでください。