[MyBatis のステレオタイプ] MyBatis の面接の質問

目次

マイバティスとは何ですか?

  • Mybatis は、JDBC、ドライバーのロード、接続の作成、ステートメントの作成などの複雑なプロセスをカプセル化したセミ ORM (オブジェクト リレーショナル マッピング) フレームワークであり、開発者は開発時に SQL ステートメントの書き方に注意するだけでよく、厳密に制御できます SQL 実行パフォーマンス、高い柔軟性。
  • 半 ORM フレームワークとして、MyBatis はXML またはアノテーションを使用してネイティブ情報を構成およびマッピングし、POJO をデータベース内のレコードにマッピングし、ほぼすべての JDBC コードとパラメータの手動設定と結果セットの取得を回避できます。
  • XML ファイルまたはアノテーションを通じて実行されるさまざまなステートメントを構成し、ステートメント内の Java オブジェクトと SQL の動的パラメータをマッピングすることによって、最終的に実行される SQL ステートメントを生成します。最後に、Mybatis フレームワークが SQL を実行し、結果を Java にマップします。異議を唱えて返す。(SQLを実行して結果を返すまでの処理)
  • MyBatis は SQL 自体に重点を置いており、柔軟性が高いため、インターネット プロジェクトなど、高いパフォーマンス要件や要件が変化するプロジェクトに適しています。

マイベイトのメリットとデメリットは?

アドバンテージ:

  • SQL ステートメント プログラミングに基づいており、非常に柔軟であり、アプリケーション プログラムやデータベースの既存の設計に影響を与えません。SQL は XML で記述されており、SQL をプログラム コードから切り離し、統一管理を容易にします。XML タグは、動的 SQL ステートメントの作成をサポートしており、再利用できます。
  • JDBC と比較して、コード量が 50% 以上削減され、JDBC の多数の冗長コードが排除され、手動によるスイッチ接続が不要になります。
  • さまざまなデータベースとの互換性が非常に優れています (MyBatis はデータベースへの接続に JDBC を使用するため、データベース MyBatis が JDBC サポートをサポートしている限り)。
  • Spring とうまく統合できます。
  • オブジェクトとデータベース間の ORM フィールド関係マッピングをサポートするマッピング タグを提供し、オブジェクト リレーショナル コンポーネントのメンテナンスをサポートするオブジェクト リレーショナル マッピング タグを提供します。

欠点:

  • SQL ステートメントを記述する作業負荷は比較的大きく、特にフィールドが多く、関連テーブルが多数ある場合には、開発者が SQL ステートメントを記述するための特定の要件が必要になります。
  • SQL ステートメントはデータベースに依存しているため、データベースの移植性が低く、データベースを自由に置き換えることはできません。

Mybatis が半自動 ORM マッピング ツールであるのはなぜですか? 全自動との違いは何ですか?

Hibernate は完全に自動化された ORM マッピング ツールです。Hibernate を使用して関連オブジェクトまたは関連コレクション オブジェクトをクエリする場合、オブジェクト関係モデルに従って直接取得できるため、完全に自動化されます。Mybatis が関連オブジェクトまたは関連コレクション オブジェクトをクエリする場合、SQL を手動で記述して完了する必要があるため、半自動 ORM マッピング ツール
と呼ばれます

Hibernate と MyBatis の違いは?

同じ点: これらはすべて Jdbc のカプセル化であり、両方とも永続化層のフレームワークであり、両方とも Dao 層の開発に使用されます。

違い

  • マッピング関係
    MyBatis は、Java オブジェクトと SQL 文の実行結果との対応関係を設定する半自動マッピングフレームワークであり、複数テーブルの関連付けの設定が簡単です。
    Hibernate は、 Java オブジェクトとデータベース テーブル間の対応関係を構成する完全なテーブル マッピングフレームワークであり、複数のテーブルの関連付けの構成は複雑です。

  • SQL の最適化と移植性
    Hibernate は SQL ステートメントをカプセル化し、ロギング、キャッシュ、カスケード (カスケードは MyBatis よりも強力です) などの機能を提供し、データベースを操作するための HQL (Hibernate Query Language) も提供します。データベースは独立性を十分にサポートしており、ただし、消費パフォーマンスはさらに高くなります。プロジェクトで複数のデータベースをサポートする必要がある場合、コード開発の量は少なくなりますが、SQL ステートメントを最適化するのは困難です。
    MyBatis は SQL を手動で記述する必要があり、動的 SQL をサポートし、リストを処理し、テーブル名を動的に生成し、ストアド プロシージャをサポートします。開発作業量は比較的大きいです。SQL文を直接使用してデータベースを操作するため、データベースの独立性はサポートしていませんが、SQL文の最適化が容易です。

  • 開発難易度と学習コスト
    Hibernate は、学習や使用の敷居が高い重量級フレームワークであり、比較的安定した要件や OA システムなどの中小規模のプロジェクトに適しています。MyBatis は、学習や使用の障壁が低い軽量フレームワークであり、インターネット電子商取引システムなど、要件が頻繁に変更される大規模プロジェクトに適しています。

概要: MyBatis は、小型、便利、効率的、シンプル、直接的、半自動の永続化レイヤー フレームワークであり、Hibernate は強力で便利、効率的、複雑で間接的な、完全に自動化された永続化レイヤー フレームワークです。

JDBC プログラミングの欠点は何ですか?MyBatis はこれらの問題をどのように解決しますか?

1. データベースリンクの作成と解放が頻繁に行われると、システムリソースが無駄に消費され、システムパフォーマンスに影響を及ぼしますが、データベースリンクプールを使用すると、この問題を解決できます。

解決策: SqlMapConfig.xml でデータ接続プールを構成し、その接続プールを使用してデータベース接続を管理します。

2. SQL ステートメントはコード内に記述されるため、コードの保守が困難になります。SQL の実際のアプリケーションは大幅に変更される可能性があります。SQL の変更には Java コードの変更が必要です。

解決策: XXXXmapper.xml ファイル内の Java コードから SQL ステートメント設定を分離します。

3. SQL文にパラメータを渡すのは面倒です。SQL文のwhere条件は必ずしも定かではなく、多かれ少なかれ存在する可能性があり、プレースホルダとパラメータを一つ一つ対応させる必要があるためです。

解決策: Mybatis は Java オブジェクトを SQL ステートメントに自動的にマップします。

4. 結果セットの解析は面倒です。SQL を変更すると解析コードも変更されるため、解析する前にコードを調べる必要があります。データベース レコードを POJO オブジェクトに解析するほうが便利です。

解決策: Mybatis は SQL 実行結果を Java オブジェクトに自動的にマッピングします。

MyBatis のプログラミング手順は何ですか?

  • 1.SqlSessionFactoryを作成する
  • 2. SqlSessionFactory を通じて SqlSession を作成する
  • 3. sqlsession を通じてデータベース操作を実行する
  • 4. session.commit() を呼び出してトランザクションをコミットします。
  • 5. session.close() を呼び出してセッションを閉じます

#{} と ${} の違いは何ですか?

[MyBatis プレースホルダー] Mybatis の #{} と ${} の違い

通常、XML マッピング ファイルには、それに対応する Dao インターフェイスが記述されます。では、この Dao インターフェイスの動作原理は何でしょうか? Daoインターフェースのメソッドとパラメータが異なる場合、メソッドはオーバーロードできますか?

Dao インターフェースは Mapper インターフェースです。インターフェイスの完全修飾名はマッピング ファイル内の名前空間値、
インターフェイスのメソッド名はマッピング ファイル内の Mapper ステートメントの ID 値、
インターフェイス メソッド内のパラメータは SQL に渡されるパラメータです。
Mapperインターフェースには実装クラスが存在せず、インターフェースのメソッドを呼び出す際には、インターフェースの完全名+メソッド名を連結した文字列がキー値として使用され、MapperStatementを一意に見つけることができます。

Dao インターフェースのメソッドは、フルネーム + メソッド名の保存と検索戦略であるため、オーバーロードできません。
Dao インターフェイスの動作原理は JDK ダイナミック プロキシです。Mybatis は JDK ダイナミック プロキシを使用して、実行時に Dao インターフェイスのプロキシ プロキシ オブジェクトを生成します。プロキシ オブジェクト プロキシはインターフェイス メソッドをインターセプトし、MappedStatement で表される SQL を実行します。を実行し、SQLの実行結果を返します。

マッパーで複数のパラメータを渡すにはどうすればよいですか?

  • Dao レイヤー関数に複数のパラメーターがある場合、対応する XML では、#{0} が Dao レイヤーの最初のパラメーターを表し、#{1} が Dao の 2 番目のパラメーターを表します。

  • @Param アノテーションを使用する: Dao レイヤーのパラメーターの前に @Param アノテーションを追加します。アノテーション内のパラメーター名は、マッパーに渡されるパラメーター名になります。

  • 複数のパラメータは Map にカプセル化され、HashMap の形式で Mapper に渡されます。

Mybatis 動的 SQL は何に役立ちますか? 実行の原則は何ですか?動的SQLとはどのようなものですか?

Mybatis動的SQLは、XMLマッピングファイル内にタグ形式で動的SQLを記述することができ、実行原理は式の値に基づいて論理判断を完了し、SQL関数を動的に結合することです。

Mybatis は、trim、where、set、foreach、if、choose、when、otherwise、bind の 9 つの動的 SQL タグを提供します。

その実行原理は、OGNL (Object Graph Navigation Language) を使用して SQL パラメータ オブジェクトから式の値を計算し、式の値に従って SQL を動的に結合して動的 SQL の機能を完成させることです。

XML マッピング ファイル内で、異なる XML マッピング ファイル ID を繰り返すことはできますか?

さまざまな XML マッピング ファイルでは、名前空間が構成されている場合は ID を繰り返すことができます。名前空間が構成されていない場合は、ID を繰り返すことができません。その理由は、名前空間がない場合、名前空間 + ID がキーとして使用されるため
ですMap<String,MapperStatement>。 ID のみが残り、ID が繰り返されます。データは相互に上書きされます。名前空間の場合は自然にidを繰り返すことができますし、名前空間が異なれば当然名前空間+idも異なります。

Mybatis が 1 対 1 を実装する方法は何通りありますか? どのように機能するのでしょうか?

結合クエリとネストクエリの 2 つの方法があります。
結合クエリは、複数のテーブルの結合クエリであり、 resultMap の関連ノードを構成して 1 対 1 クラスを構成することで完了できます
。ネストされたクエリは、最初にテーブルをチェックし、次に次に従って別のテーブルに移動します。このテーブルの結果の外部キー ID テーブル内のクエリ データも関連付けによって構成されますが、別のテーブルのクエリは選択によって構成されます。

Mybatis は 1 対多を実装する方法が何通りありますか? どのように機能するのでしょうか?

結合クエリとネストクエリの 2 つの方法があります。
結合クエリは複数のテーブルの結合クエリであり、クエリは 1 回だけ行われます。これは、 resultMap のコレクション ノードに1 対多のクラスを構成することで完了できます
。ネストされたクエリは、最初にテーブルをチェックし、このテーブルの結果の外部キー ID に従って、別のテーブルに移動してデータをクエリします。これもコレクションを通じて行われますが、別のテーブルのクエリは選択を通じて構成されます。

Mybatis の 1 次キャッシュと 2 次キャッシュとは何ですか?

  • 1. レベル 1 キャッシュ: PerpetualCache に基づく HashMap ローカル キャッシュ。そのストレージ スコープはセッションです。セッションがフラッシュまたはクローズされると、セッション内のすべてのキャッシュがクリアされ、レベル 1 キャッシュはデフォルトで有効になります。
  • 2. 第 2 レベル キャッシュは、第 1 レベル キャッシュのメカニズムと同じです。デフォルトでは、PerpetualCache および HashMap ストレージを使用します。違いは、そのストレージ スコープが Mapper (名前空間) であり、ストレージ ソースがカスタマイズできることです。 Ehcacheとして。2 次キャッシュはデフォルトでは有効になっていません。2 次キャッシュを有効にするには、2 次キャッシュ属性クラスを使用して Serializable シリアル化インターフェイス (オブジェクトの状態を保存するために使用できます) を実装する必要があります。これはマッピング ファイルで設定できます。

キャッシュ データ更新メカニズムでは、特定のスコープ (一次キャッシュ セッション/二次キャッシュ ネームスペース) が追加/削除/変更されると、このスコープ内の選択内のすべてのキャッシュがデフォルトでクリアされます。

MyBatis の Mapper インターフェイスを呼び出すときの要件は何ですか?

  • 1. Mapper インターフェースのメソッド名は、mapper.xml で定義された各 SQL の ID と同じです。
  • 2. Mapper インタフェースメソッドの入力パラメータの型は、mapper.xml で定義されている各 SQL のparameterType 型と同じです。
  • 3. Mapper インターフェース メソッドの出力パラメータの型は、mapper.xml で定義された各 SQL の resultType と同じです。
  • 4. Mapper.xml ファイル内の名前空間は、マッパー インターフェイスのクラスパスです。

おすすめ

転載: blog.csdn.net/qq_44033208/article/details/132409109