由于java视频里以前好多都是SSH。但是在实际工作中没见过用hibernate的,基本都用mybatis。
我有一些疑问:
hibernate碰到什么样的业务会变成致命的弱点,都说hibernate效率低,能否举个例子(例如同一个查询用mybatis查询耗时1秒,用hibernate查询耗时10秒)
可能是有部分人遇到了hibernate的瓶颈,但是这部分人的业务量我觉得,不是大部分使用hibernate的人都能遇到的。一般的小项目,不超过100个用户,这样的项目综合考虑的话更适合用mybatis还是hibernate?主要从开发效率上来说的话。为什么?
巴扎黑2017-04-18 09:34:16
Zhihu にも同様の質問があります。
私が多くの票を集めた答えは、hibernate
は mybatis
よりも習得が難しく、SQL の制御が弱いというものです。
PHPz2017-04-18 09:34:16
両者の関係を比較し、開発効率、保守性、パフォーマンスの 3 つの側面から考察します。その重要性としては、プロジェクトエンジニアリングの開発プロセスにおいては、開発効率>保守性>パフォーマンスとなります。おそらくビジネスによっては、パフォーマンスの方が重要視されることもあると思いますが、全体的に見ると、開発効率 > 保守性 > パフォーマンス だと個人的には感じています。
まず第一に、開発効率です。個人的には、単純な追加、削除、変更、クエリだけを含む単純な CMS のようなプロジェクトを実行する場合は、Hibernate を使用する方が有利であると感じています。Hibernate の知識をあまり習得する必要はなく、知っておくだけで十分です。いくつかの基本的なクエリといくつかの設定 (Hibernate は実際には学ぶためのものであり、個人的には知識の量が mybatis よりもはるかに多いと感じています)。 hiberbate は Java オブジェクトを使用して SQL を書き込みますが、mybatis はネイティブ SQL を直接書き込みます。 Hibernate は優れたマッピング メカニズムを提供しますが、mybatis も resultmap paramMap 自体を記述する必要があります。 Hibernate と MyBatis は両方とも、対応するコード生成ツールを備えています。シンプルで基本的な DAO レイヤー メソッドを生成できます。高度なクエリの場合、Mybatis では SQL ステートメントと ResultMap を手動で記述する必要があります。 Hibernate には優れたマッピング メカニズムがあり、開発者は SQL の生成や結果のマッピングを気にする必要がなく、ビジネス プロセスに集中できます。まとめると、開発効率の観点から言えば、Hibernate>mybatis.
保守性: hiberbate は Java オブジェクトを使用して SQL を書き込みますが、mybatis はネイティブ SQL を直接書き込みます。 SQL を直接記述するほうが保守は簡単ですが、前者の場合は、SQL を表示する前に System.out.println(sql) を使用して SQL を表示する必要があります。 Hibernate のクエリはテーブル内のすべてのフィールドをクエリするため、パフォーマンスが消費されます。 Hibernate は独自の SQL を記述してクエリが必要なフィールドを指定することもできますが、これでは Hibernate 開発の単純さが損なわれます。 Mybatis の SQL は手動で記述されているため、必要に応じてクエリ フィールドを指定できます。 Hibernate HQL ステートメントをチューニングするには SQL を出力する必要がありますが、Hibernate の SQL はあまりにも醜いため、多くの人に嫌われています。 MyBatisのSQLは自分で手書きで書いているので調整が簡単です。ただし、Hibernate には独自のログ統計があります。 Mybatis 自体にはログ統計がなく、ログ記録に Log4j を使用します。
パフォーマンス: どちらもキャッシュとセッションのメカニズムを提供します。小規模なプロジェクトはほぼ同じです。大規模なプロジェクトは mybatis>休止状態になります。
黄舟2017-04-18 09:34:16
皆さんの議論を見てるとmybaitsの方が良いような気がしますが、大規模開発にはhibernateの方が向いていると常々思っていたので、hibernateを採用しました。当時、プロジェクトは非常に緊急だったので、mybatis のように使用していました。その後、長い間プレイした後、hibernate によって提供されるエクスペリエンスによって多くの作業負荷と互換性が簡素化されることがわかりました。しかし、これらには間違いなく必要なものがありました。経験を積んで理解してください。休止状態検索と全文検索を使用すると便利なので、それを変更する方法はありません。とにかく、ネイティブ SQL または HQL を作成できます。また、補助的なアノテーションもあります。ネイティブ SQL とは異なる one2many や many2many のデータ構造も生成できます。つまり、彼は非常に包括的な人です。まだ後悔していないのであれば、学習を続けてください。通常、休止状態ツールを使用して、すべてのテーブルの Java および XML マッピングを自動的に作成し、一般的な検索、削除、および変更を実行します。その後、Java コードがコピーされて名前が変更され、アノテーションを使用して関連付けが手動で作成され、不要なフィールドが削除されます。
PHP中文网2017-04-18 09:34:16
Hibernate が誤って使用されると、次のようなことが起こります: P
たとえば、Hibernate のオブジェクト A に埋め込まれたオブジェクト B のロードがデフォルトの遅延ロードからプリロードに変更された場合 (その影響を理解していないと仮定すると、構成を変更したばかりです)、オブジェクト A のリストをクエリしたい場合、N+1 クエリが存在しますが、ビジネス ロジックのほとんどは埋め込みオブジェクト B を読み取る必要がないため、パフォーマンスは非常に低下します。
一般に、MyBatis の場合、この種のクエリは手動で記述する必要がありますが、このようなことが起こる可能性は低いです。
JPA (Hibernate) は非常に広範囲のコンテンツをカバーしており、多くの最適化テクニックが含まれているため、これに慣れるには多大な費用がかかります (私が持っている Hibernate In Action の本は非常に分厚くて気が遠くなります。読み終わるまでに長い時間がかかりました)、どれだけのプログラマーが読書が好きで忍耐力があるかわかりません。
ただし、MyBatis は使い始めるのがはるかに簡単ですが、間違って使用すると、MyBatis のパフォーマンスは Hibernate よりも何倍も悪くなります。そのため、間違いを犯す可能性ははるかに低くなります。
Hibernate に非常に興味があり、詳しく知りたい場合は、試してみることをお勧めします。結局のところ、ほとんどのプロジェクトは結果を迅速に生成する必要があります。
この点では、Hibernate は MyBatis よりも簡単です。他にもたくさんあります (もちろん、MyBatis にはコードを自動的に生成する方法がありますが、それでもはるかに面倒です)。
後続のプロジェクトが順調に開発され、複数の人が開発に協力する必要がある場合は、必ず初心者をそのプロジェクトから遠ざけてください。永続化レイヤーのコード ロジック。
黄舟2017-04-18 09:34:16
簡単に言うと、Hibernate はオブジェクト指向であり、MyBatis は SQL 指向です。どちらを選択するかは、スタッフがどれに精通しているか、ビジネスに多くの複雑なクエリがあるかどうか、および高いパフォーマンス要件があるかどうかによって決まります。さらに、多くの場合、人々は Hibernate に慣れていないため、Hibernate ではこれができない、または行うのが非常に複雑だと感じています。 Hibernate は、私がこの責任を負わないと言いました。 。 。
PHPz2017-04-18 09:34:16
開発中にテーブルの関連付けを行わずに論理外部キーを使用するようになりました。そのため、開発効率はほぼ同じで、Mybatis の方がシンプルかつ明確で、SQL の方が汎用性が高く、コラボレーションが若干便利です。
巴扎黑2017-04-18 09:34:16
テクノロジーには善し悪しはなく、それが適切であるかどうかだけがあり、特定の状況下で特定の問題を解決できるかどうかだけが問題です。 Hibernate を使用する人が異なれば、結果も異なります。Hibernate に習熟していれば、パフォーマンスは問題ありません。上記の 2 つの比較をたくさん見ましたが、実際にはあまり意味がありません。