91、ORMとは何ですか?
(より関連した面接の質問に関する推奨事項:java 面接の質問と回答)
オブジェクト リレーショナル マッピング (略して ORM) は、問題を解決するために設計されたプログラムです。オブジェクト指向モデルとデータベースのリレーショナル モデル間の不一致の問題;
簡単に言えば、ORM はオブジェクトとデータベース間のマッピングを記述するメタデータを使用します (Java では、XML またはアノテーションを使用できます)。プログラム内のオブジェクトをリレーショナル データベースに自動的に永続化したり、リレーショナル データベース テーブルの行を Java オブジェクトに変換したりする機能の本質は、データをある形式から別の形式に変換することです。
92、Hibernate の SessionFactory はスレッドセーフですか?セッションはスレッドセーフですか (2 つのスレッドが同じセッションを共有できますか)?
SessionFactory は Hibernate のデータ ストレージ概念に対応しており、スレッドセーフであり、複数のスレッドから同時にアクセスできます。通常、SessionFactory は起動時にのみ構築されます。アプリケーションの場合、簡単にアクセスできるように、シングルトン モードで SessionFactory をカプセル化するのが最善です。
Session は軽量の非スレッドセーフ オブジェクト (セッションはスレッド間で共有できません) であり、データベースと対話する作業単位を表します。セッションは SessionFactory によって作成され、タスクが完了すると閉じられます。セッションは、永続化レイヤー サービスによって提供されるメイン インターフェイスです。
セッションにより、データベース接続の取得が遅れます (つまり、必要な場合にのみ接続が取得されます)。作成されるセッションが多すぎることを避けるために、ThreadLocal を使用してセッションを現在のスレッドにバインドし、同じスレッドが常に同じセッションを取得できるようにします。 Hibernate 3 の SessionFactory の getCurrentSession() メソッドでこれを行うことができます。
93. Session の save()、update()、merge()、lock()、saveOrUpdate()、persist() メソッドは何をしますか?違いは何ですか?
Hibernate オブジェクトには、一時的、永続的、切り離されたという 3 つの状態があります。
インスタント状態のインスタンスは、Save ()、Persist ()、または SaveorUpdate () を呼び出して永続的に変更でき、lock() または replicate() は永続的になります。 save() とpersist() は SQL INSERT ステートメントをトリガーし、update() または merge() は UPDATE ステートメントをトリガーします。
save() と update() の違いは、一方は一時オブジェクトを永続状態に変換し、もう一方は自由オブジェクトを永続状態に変換することです。 merge() メソッドは、save() メソッドと update() メソッドの機能を完了できます。その目的は、新しい状態を既存の永続オブジェクトにマージするか、新しい永続オブジェクトを作成することです。
persist() メソッドについては、公式ドキュメントの指示に従ってください。
1.persist() メソッドは一時的なインスタンスを永続化しますが、識別子が入力されることは保証されません。永続インスタンスでは、識別子の入力はフラッシュ時間まで延期される場合があります;
2.persist() メソッドは、トランザクション外で呼び出されたときに INSERT ステートメントをトリガーしないことを保証します。長いセッションプロセスをカプセル化するには、persist() メソッドが必要です;
3. save() メソッドは、項目 2 を保証しません。識別子を返すため、すぐに INSERT ステートメントを実行します。事の外で。 lock()メソッドとupdate()メソッドの違いは、update()メソッドはデタッチ状態のオブジェクトを永続状態に変更するのに対し、lock()メソッドはデタッチ状態のオブジェクトを変更することです。変化していない状態を永続的な状態にします。
##94 では、セッションによってエンティティ オブジェクトを読み込むプロセスについて説明します。1. データベース クエリ関数を呼び出す前に、Session は最初に 1 次キャッシュ内のエンティティ タイプと主キーを検索します。1 次キャッシュの検索がヒットし、データ ステータスが正当であれば、直接戻ります。
2. レベル キャッシュにヒットがない場合、次にセッションは現在の NonExists レコードを検索します (クエリのブラックリストに相当します。無効なクエリが繰り返し出現した場合、迅速な判断を行ってパフォーマンスを向上させることができます)。 .NonExists に同じクエリ条件が存在する場合は、null を返します;
3. 1 次キャッシュのクエリが失敗した場合は、2 次キャッシュをクエリします。2 次キャッシュがヒットした場合は、直接戻ります;
4前のクエリが失敗した場合は、SQL ステートメントを発行します。クエリで対応するレコードが見つからない場合は、セッションの NonExists にクエリを追加して記録し、null を返します。
5. 以下に従って ResultSet を取得します。マッピング構成と SQL ステートメントに追加し、対応するエンティティ オブジェクトを作成します;
6. オブジェクトをセッション (レベル 1 キャッシュ) 管理に組み込みます;
7. 対応するインターセプターがある場合は、 onLoad メソッドを実行しますインターセプタ;
8. これがオンになっていて、2 次キャッシュを使用するように設定されている場合、データ オブジェクトは 2 次キャッシュに含まれます。レベル キャッシュ;
9. データ オブジェクトを返します。
#引き継ぎデータは文字列として引き継ぎデータに自動的に追加されます;
大規模なプロジェクトでは、多数の SQL ステートメントが存在する可能性がありますが、現時点では、各 SQL ステートメントに一意の ID (ID) を与えるのは簡単ではありません。この問題を解決するために、MyBatis では、マッピング ファイルごとに一意の名前空間を作成し、このマッピング ファイルで定義された各 SQL ステートメントがこの名前空間で定義された ID になるようにすることができます。この ID が各ネームスペースで一意であることが保証できれば、たとえ異なるマッピング ファイルのステートメント ID が同じであっても、競合は発生しなくなります。
java コース)
97. MyBatis の動的 SQL とは何を意味しますか?一部の複雑なクエリでは、複数のクエリ条件を指定することがありますが、これらの条件は存在する場合と存在しない場合があります。永続層フレームワークを使用しない場合は、SQL ステートメントを自分で組み立てる必要がある場合がありますが、MyBatis は次の機能を提供します。この問題を解決するには動的 SQL。 MyBatis で動的 SQL を実装するために使用される要素は主に次のとおりです:
- if - select / when / else - trim - where - set - foreach
select * from t_blog where 1 = 1
98、JDBC プログラミングの欠点は何ですか?MyBatis はこれらの問題をどのように解決しますか?
1. JDBC: データベース リンクの頻繁な作成と解放は、システム リソースの無駄を引き起こし、システム パフォーマンスに影響を与えますが、この問題はデータベース接続プールを使用することで解決できます。
MyBatis: SqlMapConfig.xml でデータ リンク プールを構成し、接続プールを使用してデータベース リンクを管理します。
2. JDBC: SQL ステートメントはコード内に記述されるため、コードの保守が困難になります。SQL の実際のアプリケーションは大幅に変更される可能性があり、SQL の変更には Java コードの変更が必要です。
MyBatis: XXXXmapper.xml ファイルで SQL ステートメントを構成し、Java コードから分離します。
3. JDBC: SQL ステートメントにパラメーターを渡すのは面倒です。SQL ステートメントの where 条件は必ずしも確実ではなく、多かれ少なかれ一定である可能性があり、プレースホルダーはパラメーターに 1 対 1 対で対応する必要があるためです。 -1つ。
MyBatis: Mybatis は Java オブジェクトを SQL ステートメントに自動的にマップします。
4. JDBC: 結果セットを解析するのは面倒です。SQL の変更により解析コードも変更されるため、解析する前にコードを走査する必要があります。データベース レコードを pojo オブジェクトに解析する方が便利です。
MyBatis: Mybatis は SQL 実行結果を Java オブジェクトに自動的にマッピングします。
99, MyBatis と Hibernate の違いは何ですか?
1. Mybatis は Hibernate とは異なります。MyBatis はプログラマー自身が SQL ステートメントを記述する必要があるため、完全に ORM フレームワークではありません。ただし、mybatis は、XML またはアノテーションを通じて実行される SQL ステートメントを柔軟に構成できます。 use java オブジェクトと SQL ステートメントがマッピングされて最終的に実行される SQL が生成され、最後に SQL 実行の結果がマッピングされて Java オブジェクトが生成されます。
2. Mybatis は学習閾値が低く習得が容易であり、プログラマがオリジナルの SQL を直接記述することができるため、SQL の実行パフォーマンスを厳密に制御でき、柔軟性が高く、リレーショナル要求が高くないソフトウェア開発に非常に適しています。インターネットソフトやエンタープライズソフトなどのデータモデル、運用ソフトなど、この種のソフトウェアは要件が頻繁に変わるため、要件が変わったらすぐに結果を出力する必要があります。ただし、柔軟性の前提として、mybatis はデータベースに依存できないため、複数のデータベースをサポートするソフトウェアを実装する必要がある場合は、複数の SQL マッピング ファイルをカスタマイズする必要があり、作業負荷が高くなります。 3. Hibernate は強力なオブジェクト/リレーショナル マッピング機能と優れたデータベース独立性を備えており、リレーショナル モデルの要件が高いソフトウェア (要件が固定されたカスタマイズされたソフトウェアなど) の場合、Hibernate を使用して開発すると、大幅なコストを節約できます。コードの削減と効率の向上。しかし、Hibernate の欠点は、学習の敷居が高く、習熟の敷居がさらに高いことであり、O/R マッピングをどのように設計するか、パフォーマンスとオブジェクト モデルをどのように比較検討するか、Hibernate を上手に使用する方法が必要であることです。強力な経験と能力。
つまり、限られたリソース環境でユーザーのニーズを維持できる限り、ソフトウェア アーキテクチャの保守性と優れた拡張性が優れたアーキテクチャであり得る限り、フレームワークは最良のものでしかありません。
(ここで自分の理解を組み合わせることもできます。遠慮しないでください)
100、MyBatis の一次キャッシュと二次キャッシュについて簡単に話してください。
Mybatis は、まずキャッシュにアクセスして結果セットをクエリします。結果セットがない場合は、データベースにクエリを実行します。結果セットがある場合は、キャッシュから結果セットを取得し、データベースにアクセスせずに結果セットを返します。データベース。 Mybatis の内部ストレージ キャッシュは HashMap を使用し、キーは hashCode sqlId SQL ステートメントです。 value はクエリからのマッピングによって生成された Java オブジェクトです
Mybatis の 2 次キャッシュはクエリ キャッシュであり、そのスコープはマッパーの名前空間です、つまり、同じ名前空間で SQL をクエリするとキャッシュからデータを取得できます。 2 次キャッシュは SqlSession にまたがることができます。
推奨される関連チュートリアル:Java 入門チュートリアル
以上がJava で頻繁に聞かれる基本的な面接の質問—(8)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。