2020年に、一般的な面接の質問の概要をMyBatisの

MyBatisの技術インサイダーは、原則として、ソースコードの観点から、それは記事がMyBatisのは、そのため、いくつかのパラメータが使用されていない使用方法を説明しますので、私は本当に慎重に、書かれた良いか悪い書き込みであるかどうか、その内部実装の詳細を紹介し、一連のブログ少しオフの詳細を、私たちの目標は、MyBatisの技術アーキテクチャおよび重要な部分だけでなく、基本的な動作原理を導入することです。

非常に難しいですが、必ずしもそうではない書き込み格好良い、非常に興奮いわゆるスタート、非常に痛みを伴うプロセスにブログの書き込みは、残念ながら終了しました。著者として、私は非常に嬉しく思いますし、私は他の誰かが書いたブログを読んで、ない他のブログには、通常、彼らの現在の研究技術上、非常にであることを技術的なポイントを学び、家族のブログからリーダー限り、あまりを求めます便利。

新たな始まりを持っているために、そこに多くのコンテンツを書き込むことができますが、私は、ライトダウンは意味、他の小さな関数のポイントは、基本的な枠組みと基本原則の下で実行されていないしていると思うが導入されている、とだけ終わりますが。書き込みのブログもいくつかの経験を蓄積し、ソースコードは、より多くのコピー、ペーストソースあまり話、それは将来の書き込みブログの原則だと思う感じている、私は読みやすく、疲れ読み、理解しやすく、美しくないし、「ボーエン精錬」、願って、長い私は、ブログ、オープンソースの分散フレームワークの原則のシリーズを書きたいです。

私の顔から出てくる勇気は、あなたがいくつかの(すべての私のうちではなく、オンラインで見つける)それに答えることができるかどうか、いくつかの質問をMyBatisの。

1.#{}と{} $であるとの違いは何ですか?

注:この質問は、私の同僚のインタビューインタビュアーです。

回答:

プロパティファイル$ {}は静的にはcom.mysql.jdbc.Driverに置き換えられるよう$ {ドライバ}としてタグプロパティ値と内部SQL、静的テキスト置換することができるプレースホルダ変数です。

#{}は、パラメータプレースホルダ、MyBatisのか?番号を持つSQL#{}内の、パラメータ設定方法は、PreparedStatementのSQL SQLに順次実行?パラメータセット番号プレースホルダの前に使用されるであろうSQLですそのようなps.setIntオブジェクトパラメータ相当param.getItem()のgetName()から物体の反射値を取得した項目名の属性値を使用して(0、parameterValue)、#{} item.name方法。

2、XMLマッピング・ファイル、共通に加えて選択|挿入| updae |ラベルを削除するよりも、どのようなラベルを?

注:この質問はインタビューIのJingdongの面接で聞かれました。

A:他の多くのタグがありますが、<このresultMap>、<なparameterMap>、<SQL>、、<selectKey>、プラストリム9個の動的SQLタグ、<include>を|選択|場合| |セット| foreachの|とき|断片導入されたSQLは、<include>のバインド、タグがSQL断片である、のようなタグ、<selectKey>ラベルの主キーの生成方法増分をサポートしていません|そう。

3は、ベストプラクティスは、通常、XMLマッピング・ファイルは、私が求めることができる、ダオに対応するインタフェースを記述します、インターフェイスの動作原理は、ダオは何かありますか?方法、パラメータのDAOインターフェイスが異なる、方法は、それをリロードすることができますか?

注意:この質問はインタビューIのJingdongの面接で聞かれます。

解答:ダオ・インターフェースは、しばしば言われているマッパーインターフェイスのインターフェイスの完全修飾名は、マップファイルの値の名前空間であり、インタフェースメソッド名は、IDマッピングファイルMappedStatement値であり、インターフェースメソッド内のパラメータが転送することですSQLのパラメータ。com.mybatis3.mappers.StudentDao.findStudentByIdは、一意の名前空間を見つけることができる:メソッド呼び出しインタフェース、インタフェース名+文字列連結キー値として完全に修飾されたメソッド名は、例えば、一意に配置MappedStatementかもしれない実装クラスインターフェースマッパー、 ID = findStudentById com.mybatis3.mappers.StudentDaoはMappedStatement未満です。MyBatisの中で、それぞれ、<挿入>、<更新>、<削除>タグはMappedStatementオブジェクトに解決され<選択>。

ポリシーを維持するために、完全修飾名+メソッド名を見つけることですので、インターフェイスメソッドでダオは、オーバーロードされていません。

DAOインターフェイスがJDKの動的プロキシはプロキシプロキシオブジェクトDAO JDK動的プロキシインタフェースの生成を実行MyBatisのに使用される動作であり、SQL MappedStatementの実装に有利な方法インターフェイスプロキシオブジェクトプロキシインターセプトは、SQL実行結果が返され、その後、表現しました。

4、MyBatisのどのページに至るまで?原則として改ページプラグインは何ですか?

注:私はアウトです。

A:MyBatisのRowBoundsは、ページングを使用してオブジェクト、ページングがあることは、物理的なページ機能を完了するには、むしろ物理ページより、実行するためのSQL内の物理ページとの直接書き込みのパラメータを設定あなたはまた、完全なページネーションへのプラグインを使用することができます結果のResultSet物理ページ。

基本原理は、提供されるプラグインタブMyBatisのプラグインインターフェイスを使用するカスタム・プラグインを達成するために、挿入方法内で実行されるSQL切片傍受し、SQLを書き換え、方言方言に従って、物理ページング・パラメータに対応する文と、物理ページを追加です。

たとえば:学生から_を選択し、SQLのように書き換えるインターセプト:から選択t._トン限度0,10(* \選ぶ学生から)

図5は、動作原理はMyBatisのプラグインを概説し、ならびにプラグインを作成する方法。

注:私はアウトです。

A:MyBatisのが唯一のこれら四つのプラグインインタフェース、機能をブロック達成するためのインターセプト・インタフェース・メソッドへのプロキシオブジェクト・インタフェース生成必要、4通のインターフェイスのたびに実施するためMyBatisの使用JDKの動的プロキシのParameterHandler、ResultSetHandler、StatementHandler、執行のために書かれますオブジェクトのメソッドは、インターセプト法に入りますと、コンクリートはのInvocationHandlerのinvoke()メソッドで、もちろん、あなただけは傍受を指定し、それらをインターセプトする必要があります。

インターセプタインターフェースと複製インターセプト()メソッドを達成し、その後、プラグインにメモを書くインターセプトするメソッドに、覚えているインターフェイスを指定MyBatisの、コンフィギュレーション・ファイルのプラグインで、あなたの設定を記述することを忘れないでください。

6、MyBatisのは、一括挿入を実行し、データベースの主キーのリストを返すことができますか?

注:私はアウトです。

A:確かにはい、JDBCことができ、MyBatisのことができます。

7、MyBatisのダイナミックSQLが何をしているのですか?動的SQLは何ですか?動的SQLの実行の缶簡単に原理はないですか?

注:私はアウトです。

A:MyBatisのダイナミックのSQLは、XMLマッピングファイル、ラベル、完全なロジックおよび動的なスプライシングSQL関数、MyBatisの申し出9つの動的SQLタグトリムの形で書き込み、動的SQLで私たちを聞かせすることができます| |セット| foreachの| |の場合とき| |そう|バインドを選択します。

その実行の原理、動的SQL関数を完了するために、動的スプライシングSQL式の値に応じて、OGNL SQLパラメータオブジェクトを使用して、式から算出される値。

図8は、MyBatisのは、SQLパッケージを実行する方法であるターゲットオブジェクトとリターンの結果ですか!マッピングの形式は何ですか?

注:私はアウトです。

A:最初の列名およびオブジェクトのプロパティの名前との間のマッピングを定義する、<このresultMap>タグを使用することです。第二の機能は、列エイリアス名は、例えばT_NAME AS NAMEなどのオブジェクトのプロパティとして書き込まれ、別名SQLカラムを使用することで、一般的なオブジェクトのプロパティは、小文字、名前であるが、列名はケース非感受性である、MyBatisのは、列名のケースを無視しますMyBatisのが正常に動作することができますようにスマートな発見、対応するオブジェクトのプロパティ名、あなたも、T_NAMEなどの名前を書くことができます。

あなたが名前や属性名、リフレクションを通じてオブジェクトを作成MyBatisの間の列マッピングを持っていたら、個別のオブジェクトとリターンのプロパティに割り当てられた使用の反射が、これらのプロパティは、マッピング関係を見つけることができない、割り当てを完了することができません。

9、MyBatisのは、一つにあなたの多くに1をリレーショナルクエリ1を実行することができますか?実装だけでなく、それらの違いは何ですか。

注:私はアウトです。

A:はいMyBatisのは一から一、多くの関連クエリに1を実行できるだけでなく、あなたはまた、多対多のリレーショナルクエリを実行することができ、多くの対クエリ、クエリは実際には1つ上の一つです、selectOne(ちょうど必要性)SelectListのように変更()とすることができる;多くの問い合わせに多く、実際には、多くのクエリー、ちょうど必要selectOne()であることができる)(SelectListのように変更します。

二つの方法で実現クエリ関連の目的は、一つのオブジェクトがマスタに割り当てられている、SQL関連するオブジェクトへの単一のクエリを送信し、その後、主被写体に戻ります。別のネストされたクエリを使用することで、意味はネストされたクエリの使用は、クエリに参加する場合、列Aの部分は、オブジェクトの属性値であり、カラムの一部が物体Bに関連付けられた属性値であり、利点のみSQLクエリを作られ、それはすることができ第一の目的とそれに関連するオブジェクトが判明しました。

そこで問題は、代わりに100の、主なターゲットは5であるかを決定する方法を、100件のレコードをチェックしてください参加するのですか?原則であるという点で、重複排除、<このresultMap>タグ<ID>子タグ、レコードを決定するためにユニークなID列が割り当てられ、MyBatisのは、列の値は、<ID>は複数持つことができる重複排除機能100回の記録を実現、これは、セマンティック共同主キーを表します。

また通常の状況下で、唯一の主要目標は、レコードを複製するが、この原理によれば、主被写体で繰り返される関連する、一般的に関連するオブジェクトは繰返しません。

例:以下は、外クエリレコードに参加6、一つは二教師代わり6人の教師学生6の、教師、生徒6の結果としてMyBatisの重複排除処理後のオブジェクト列、学生オブジェクトとして3列です。

t_id t_name S_ID

| 1 | 教師| 38 | | 1 | 教師| 39 | | 1 | 教師| 40 | | 1 | 教師| 41 | | 1 | 教師| 42 | | 1 | 教師| 43 |

10、MyBatisのは、遅延ロードをサポートしていますか?もしそうなら、その原理は達成するためには何かありますか?

注:私はアウトです。

:MyBatisの関連は専用のコレクションは、多くのクエリを指し、関連付けは1を意味し、遅延ロードに関連付けられているオブジェクトのコレクションと関連するオブジェクトのコレクションをサポートしています。偽| MyBatisの設定ファイルでは、あなたは=真lazyLoadingEnabled遅延読み込みを有効にするかどうかを設定することができます。

その原理は、ターゲットメソッドの呼び出しが、そのようなコールa.getB()。関連項目GetName()などのインターセプタメソッドを、入力したときCGLIBは、ターゲットオブジェクトのプロキシオブジェクトを作成し使用することで、インターセプタのinvoke()メソッドはa.getB()があるが見つかりました。ヌル値は、それが保存されたクエリが事前SQL関連オブジェクトBに送ら分離する、Bアップクエリは、次にa.setB(B)を呼び出し、ターゲット属性値bがあり、次いでa.getB(終了).getName()メソッドを呼び出します。これは、基本的な原則遅延ロードです。

もちろん、だけでなく、MyBatisの、ほぼすべてのHibernateのを含め、原則のための遅延ロードのサポートは同じです。

図11に示すように、XMLマッピング・ファイル、別のXMLマッピング・ファイル、IDのMyBatisのは、あなたは繰り返すことができますか?

注:私はアウトです。

:すべての名前空間が必要とされていない後、しかし、ベストプラクティス、それ;構成された名前空間が存在しない場合は、idが繰り返すことはできません別のXMLマッピングファイルには、コンフィギュレーションの名前空間場合は、IDを繰り返すことができます。

名前空間が存在しないかのような理由は、その名前空間+ idが、その後、idは互いに上書き重複したデータにつながる、キーを使用して、ID地図<文字列、MappedStatement>を残して、です。名前空間では、自然のIDは、異なる名前空間、名前空間+ ID当然異なって繰り返すことができます。

バッチ処理を実行するための方法12、MyBatisの?

注:私はアウトです。

A:使用バッチ処理完了したバッチ。

13、MyBatisのエグゼキュータは何ですか?それらの違いは何ですか?

注:私はアウトです

A:MyBatisのは、SimpleExecutor、ReuseExecutor、バッチ処理の基本的な3つのエグゼキュータがあります。

** SimpleExecutor:**たびに更新または選択し、ちょうど、Statementオブジェクトを開き、すぐに閉じられたStatementオブジェクトを実行します。

** `` ReuseExecutor`は:**更新を実行するか選択し、キーとしてSQL Statementオブジェクトが使用上に存在する見つけること、それは閉じないStatementオブジェクトの操作を行い、使用後に、作成するために存在していませんが、置い地図<文字列、声明>内部に、次の使用のために。短い、再利用Statementオブジェクトで。

**バッチ処理:**(選択しないで、JDBCはバッチ選択をサポートしていません)、すべてのSQLをバッチに追加されたアップデートを実行する(addBatch())、均一な実装(のexecuteBatch())を待って、それはより多くのステートメントをキャッシュオブジェクト、各ステートメントオブジェクトは、1つのexecuteBatch()バッチによる実行のいずれかの待機、終了後addBatch()です。そして、JDBC同じバッチ。

スコープ:キュータこれらの機能は、厳密に範囲SQLSESSIONのライフサイクルに制限されています。

14、MyBatisのは、エグゼキュータエグゼキュータを使用するかを指定する方法?

注:私はアウトです

:MyBatisの設定ファイルは、あなたが手動でDefaultSqlSessionFactoryの型パラメータのExecutorType SQLSESSIONを転送する方法を作成することができ、デフォルトExecutorTypeアクチュエータのタイプを指定することができます。

15、MyBatisのか列挙型は、列挙クラスをマッピングすることができますか?

注:私はアウトです

:MyBatisの列挙クラスをマッピングすることができるだけでなく、列挙クラスをマッピングすることができ、MyBatisのテーブル上の任意のオブジェクトにマッピングすることができます。カスタム・マッピング・モードTypeHandler、setParameterをTypeHandler()とのgetResult()インターフェイスメソッドを達成します。TypeHandlerは2つの機能を有し、一方はJavaTypeがjdbcTypeの変換を完了することであるjdbcTypeのJavaType変換方法には、2つの完了したプレースホルダパラメータセットのSQL疑問符を表す、setParameterを2つ()とのgetResult()を反射し、カラムを得ますクエリ結果。

16、MyBatisのマッピングファイル、Bは、私は、求めることができる私は、ラベルAの後ろにBのラベルを定義することができ、またはことを、ラベルを含めるの内容を参照することにより、Aラベルは、Aは、前のラベルで定義する必要がありますか?

注:私はアウトです

:MyBatisのは順番に解析されるXMLマップファイルを解析するが、しかし、BのラベルはまだMyBatisのが正しく識別することができ、任意の場所に定義することができます参照されています。

原理は、MyBatisのAラベルの解析で、参照は、Bは、ラベル・タグを見つけましたが、タグがBに解決されていない、A-ラベルはMyBatisのは、未解決の意志ラベル、この時点では、まだ存在していない、とBを含む、ラベルの残りの部分を解析しますラベルは、すべてのラベルが完了し、解決する、MyBatisのは、未解決のタグとしてマークされ、それらを再レンダリングし、時間ラベルaを-パース再度、Bタグがすでに存在して、それが正常に行わラベルを解決することができます。

17、MyBatisのXMLマッピングファイルとMyBatisの内部データ構造の簡単な間のマッピング?

注:私はアウトです

:MyBatisののXmlすべての構成情報は、内部のオールインワン構成のヘビー級のオブジェクトにカプセル化されます。XMLマッピングファイルでは、<なparameterMap>タグたParameterMapオブジェクトに分解され、各サブ素子がParameterMappingオブジェクトとして解析されます。<このresultMap>タグはこのresultMapオブジェクトに分解され、各サブ要素は、オブジェクトをResultMappingとして解析されるであろう。それぞれが<選択>、<挿入>、<更新>、<削除>タグはMappedStatementオブジェクトに解決され、タグBoundSql内のSQLは、オブジェクトに解析されます。

18、なぜMyBatisの半自動ORMマッピングツール?自動でどこが異なるのですか?

注:私はアウトです

答え:それは完全に自動化されてHibernateのORMは、完全に自動マッピングツールである、Hibernateのクエリ関連するオブジェクトまたはコレクションオブジェクトの使用は、直接、オブジェクトリレーショナルモデルに基づいて求めることができます。完了するために手動で書き込みSQLへの必要性に関連したオブジェクトの関連するオブジェクトまたはコレクションを照会する場合やMyBatisのため、半自動ORMマッピングツールと呼ばれます。

フェイスの質問は非常に単純なように見えるが、それを正しく答えることができるようにしたいことがあり、それは徹底的に研究し、人々に関連するすべての顔の質問と回答の上、精通使用するかだけでなく、人々のソースする必要があります原則的に私のブログシリーズMyBatisの中の含有量は、詳細な説明と分析しています。

 



材料は、ネットワークから場合侵害作者に連絡してください削除します

おすすめ

転載: www.cnblogs.com/QQ12538552/p/12335988.html