myBatisがHibernateより優れている点は何ですか?[閉まっている]


33

私は自分でいくつかの研究を行い、基本的な概念を理解しました。しかし、いくつかの洞察は、実際の経験を通してしか得られません。

新しいフレームワークを学ぶ価値があるmyBatisの利点は何ですか?
どのような場合に使用を避けますか?


3
私は両方をテストし、Cayenneを使用することになりました。
deadalnix

回答:


38

あなたが達成しようとしていることを考慮してください。通常、Command Query Response Segregation モデルは、複雑なドメインに適しています。

その理由は、通常、次の2つのいずれかを実行しようとしているためです。

  1. いくつかの複雑なドメインエンティティの作成/更新/削除
  2. 分析フェッチクエリ(つまり、集計/集計クエリ)を実行する

Hibernateはケース1でうまく機能し、POJOを作成して永続化/更新することができます。ドメインが非常に大きい場合を除き、これも迅速に行われます。

myBatisは、単に答えが必要なクエリ(ケース2)のフェッチに最適です。Hibernateはオブジェクトグラフ全体をロードしようとするため、LazyLoadingトリックを使用してクエリをチューニングし、大規模なドメインで動作を維持する必要があります。これは、エンティティオブジェクトを返さない複雑な分析クエリを実行する場合に重要です。この場合、HibernateはBigDecimalのような巨大なデフォルト型を持つSqlQueryとBeanトランスフォーマーのみを提供しますが、myBatisは単純なPOJO非エンティティに簡単にマッピングできます。

これら2つのケースは、ドメインデータを変更するコマンドと、一部のデータを取得するだけの応答との違いです。

したがって、これら2つのケースと、アプリケーションが何をするかを検討してください。単純なドメインがあり、情報を取得するだけの場合は、myBatisを使用します。複雑なドメインがあり、エンティティを永続化する場合は、Hibernateを使用します。両方を行う場合は、ハイブリッドアプローチを検討してください。それは私たちがコントロール下に保つために何千ものエンティティを持つプロジェクトで使用するものです。;)


2
Hibernateは、ケース2でもうまく機能します。簡単な例については、mkyong.com
Mike Partridge

3
「Hibernateはオブジェクトグラフ全体をロードしようとします」これは設定ミスのように聞こえます。「LazyLoadingトリックを使用してクエリのチューニングを開始する必要があります」は、fetch = eagerをどこかに設定したように聞こえます。JPAにはJPQLがあり、これは実質的にSQLですが、Hibernate / JPAとうまく統合されています。私はそれが非常にうまくいくと思います。ORMを100%正しく構成する前に、1年以上実稼働環境で実行するのが一般的です。構成エラーだと言っても、私は最小化していません-これらのツールを使用した構成は、本当に時間がかかり、注意が必要です!
グレンペターソン

3
@GlenPeterson Hibernateを飼い慣らすことはできないと言っているわけではありませんが、ほとんどの人にとって、引用したように最適化が行われない限り、すぐに複雑なドメインエンティティがロードされます。複雑な分析クエリは、ほとんどのユーザーにとってmyBatisを使用するとより簡単になりますが、実際にはORMでも同じことが実現できます。多くの人にとっての質問は、彼らの製品に対してORMのベンダーの独立性が必要かどうかです。
ジョセフラスト

10
Hibernateのようなふりは、DBが下になく、Javaコレクションを使用して設計されているかのようにデータモデルを扱うだけです。ほとんどの場合そうではありません。DBレベルでは、データ表現は非常に異なる場合があり、それをJavaコレクションに自動的にマップしようとすることは必ずしも意味をなさない。これがHibernateが「漏れやすい抽象化」の完璧な例である理由です。MyBatisは非常にシンプルで理解しやすく、魔法もありません。そして、SQLベースのデータベースにSQLを使用しても何も問題はないので、良いことを見つけるSQLがあります。
マルチン

2
@Marcin素晴らしい点。Hibernateでのコレクションエミュレーションに関する問題があまりにも多く見られました。たとえば、いくつかのコードはmyBag.size()を呼び出し、Hibernateはカウントする前に750Kオブジェクトをメモリにロードしようとします。SQLのみが必要な場合は、SQLを使用します。
ジョセフラスト14年

19

MyBatisはSQL中心です。SQLステートメントを呼び出し、結果(テーブル)をオブジェクトツリーにマッピングします。

主な利点は、ORMではないことです。テーブルをオブジェクトにマップしないため、ormインピーダンスの不一致は発生しません。複雑なデータベースやレガシーデータベース、またはストアドプロシージャ、ビューなどのdb機能を使用するのに適しています。

非常にシンプルで簡単に習得できるので、スキルの低いチームにも適しています。冬眠の第一人者が必要ないからです。

jpetstore 6をご覧くださいhttp://mybatis.org/spring/sample.html


2
これらの「スキルの低いチーム」は、依然としてSQLを知っている必要があります。
perp

簡潔な答えとして、主な2つの違いは、db中心+浅い学習曲線です。しかし、「複雑なデータベースまたはレガシーデータベースに適している」とはまったく同意しません。DB設計をより細かく制御できるようになると、DB中心型の利点がより明確になります。
DPM

5

ので、質問が参照私のコメントは、ここで私はそれを書い念頭に置いていたものです。

まず第一に、それはあなたの元の質問の文脈から導き出されます。他の状況では、別のアドバイスをすることができます。私にMyBatisを提案させたポイントはこれです。

...パフォーマンスの問題が発生しました。

データベースのパフォーマンスを向上させるために、休止状態をドロップしてプレーンなJdbcを選択することにしました...

過去のプロジェクトの1つで、私たちのチームはあなたが説明したような理由でHibernateからの移行を検討しています。あなたと同様に、JDBCに切り替えるつもりでしたが、別のプロジェクトの同僚からMyBatisを勧められました。チームは、問題が発生した場合に備えてJDBCをフォールバックオプションとして維持しながら、試してみることにしました。

その瞬間、私はMyBatisについて何も知りませんでしたが、JDBCで十分な経験があり、それが仕事を確実に果たすことができました。それにもかかわらず、私はMyBatisを試してみるという考えを強く支持していました。主な理由は、私の過去の経験では、JDBCで記述しなければならない定型コードの量が気が遠くなるからです。

  • 公平を期すために、JDBCは理解しやすく、信頼性が高く、データベースインタラクションを適切に制御できるという点でJDBCが好きですが、その代価は本当に高いです。JDBCで入力しなければならない定型的な文字を思い出すたびに、私の指が痛むようになります。

とにかく、MyBatisを試してみましたが、宣伝どおりに機能しました。それがあなたが尋ねるコメントを書いた理由です。

テクノロジーの詳細な概要を説明すること、または何らかの方法でその優位性を賞賛することを期待する場合-申し訳ありませんが、それはできません。できれば-短いコメントを与えるのではなく、元の質問に対する別の回答にそれをすでに書いています。私は当時MyBatisについて何も知らなかったと言いました-残念ながらそれについての知識はまだほとんどありません。Hibernateからの移行は他のチームメンバーによって行われたため、作業中のコードには影響しませんでした。重要なポイントを思い出しただけです(コメントに基づいて)、1)MyBatisはHibernateの問題を解決した、2)独自の問題を導入しなかった、3)定型コードの記述を避けることができたJDBCに切り替える場合に備えて期待していました。それで全部です。


3

Hibernateはあまりにも多くの魔法、予期しない動作、大きな学習曲線でよく知られています。他にもシンプルさを重視したフレームワークがあり、管理することができます。

myBatisはその1つであり、私のプロジェクトMentaBeanは別のプロジェクトです。私はそれについて役立つブログ記事を書きました。


6
こんにちはセルジオ、ようこそ。私たちのコミュニティは、一般的に公然の自己宣伝に眉をひそめます。あなたはあなたの答えにあなたの所属を明確に開示することを要求します。あなたの答えを編集して、MentaBeanはあなたが関係しているプロジェクトであり、あなたが指しているブログ投稿を書いていることを指摘しました。 MentaBeanに関与しているある種の開示。読む関連セクション当社でよくある質問を詳細については。
ヤニス

こんにちは、ヤニス。私はそれを行います。ヘッドアップをありがとう。:)
セルジオオリベイラジュニア

-1

5年前にHibernate 3を使用してデータの読み込みおよびデータ変換プロジェクトにHibernateを使用しましたが、それは素晴らしいと思いました。私は小さなeコマースアプリケーションをやっていて、Hibernate 4を使ってみましたが、非常にがっかりしました。ツールを削除し、IDEに緊密に統合しました。MyBatisを試してみたところ、すべてが一晩で機能するようになりました。アプリケーションに簡単に統合できることにとても満足しています。Hibernateは肥大化しすぎていると思うので、この時点でHibernateではなくEJB 3を使用します。


1
EJB 3とHibernateはどのように比較されますか???
ホセ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.