私はプロジェクト(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の専門家は、私を助けてください!
洞察力ありがとう。可変スキーマは常に悪い印象を受けていましたが、このデータベースがうまく設計されていないという評判が得られた理由は他にもたくさんあります。私はちょうどそれをハッキングするのではなく、組み込みのマッパーを使用することを避けなければならないと思います。クエリをパラメータ化することが私の主な関心事でしたが、それを見て、MyBatisを少なくともその部分に利用できるかもしれないと思います。再度、感謝します! – Stoney
一般的には避けてください。実行時に列が追加された場合、エンドユーザーは表を設計しており、正規化ルールに違反している可能性があります。しかし、アプリケーションが実行時にフィールドを追加する必要がある場合は、何かをしなければならず、EAV、ホルダーカラム、または動的にカラムを追加することが必要です。 – mike
エンドユーザーが設計者であるため、データベースが「設計が不適切であるという評判」があるかもしれない1つの理由があります。エンドユーザーは、Phone1、phone2、... phone322のような列の追加を開始することがあります。ユーザーがテーブルを設計することで、それらをデザイナーにすることができます。エンドユーザーアプリケーションは、SQLDeveloperのような開発ツールになり始めます。 – mike