ホームページ Java &#&面接の質問 Java で頻繁に聞かれる基本的な面接の質問—(8)

Java で頻繁に聞かれる基本的な面接の質問—(8)

Sep 11, 2020 pm 03:59 PM
java 面接の質問

Java で頻繁に聞かれる基本的な面接の質問—(8)

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. データ オブジェクトを返します。

95、MyBatis でプレースホルダーを記述するために # と $ を使用することの違いは何ですか?

#引き継ぎデータは文字列として引き継ぎデータに自動的に追加されます;

$は送信されたデータをSQLで直接表示します。

注: $ プレースホルダーを使用すると、SQL インジェクション攻撃が発生する可能性があります。# が使用できる場所には $ を使用しないでください。order by 句を記述するときは、# の代わりに $ を使用する必要があります。

96、MyBatis における名前空間の役割について説明します。

大規模なプロジェクトでは、多数の 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 id="foo"parameterType="Blog" resultType="Blog">

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

See all articles