一般的なインタビューの質問と詳細な回答の2020年最新のJavaコレクション(11)
Java関連の資料を更新し続けます。最近、私はより包括的なインタビュー情報を収集するために、大物の最新のインタビューニュースを参照するために7日間を費やしました。最初のいくつかのコレクションを見たい場合は、私のホームページにアクセスしてそれらを見つけることができます。
答えのいくつかは私自身によって要約され、いくつかはインターネット上で収集されます。これらのインタビューを見た後、慌てないでください!もっと経験があればコメント欄でシェアしてください。間違いがあれば教えてください。教えてください、ありがとうございます〜
13.ミバティス
104. mybatisの#{}と$ {}の違いは何ですか?
-
#{}はコンパイル前の処理、$ {}は文字列の置換です。
-
Mybatisが#{}を処理するとき、sqlの#{}を?記号に置き換え、PreparedStatementのsetメソッドを呼び出して割り当てます。
-
Mybatisが$ {}を処理すると、$ {}が変数の値に置き換えられます。
-
#{}を使用すると、SQLの挿入を効果的に防ぎ、システムのセキュリティを向上させることができます。
105. mybatisにはいくつのページング方法がありますか?
-
番号グループページ
-
sqlページング
-
インターセプターページング
-
RowBoundsページネーション
106. mybatisの論理ページングと物理ページングの違いは何ですか?
-
物理ページングは必ずしも論理ページングよりも高速であるとは限りません。また、論理ページングは必ずしも物理ページングよりも高速であるとは限りません。
-
物理ページングは常に論理ページングよりも優れています。速度に利点がある場合でも、データベース側からアプリケーション側に圧力をかける必要はありませんが、他のパフォーマンス上の利点でこの欠点を補うことができます。
質問のセルフチェックを見てから詳細な回答を見ると、より効果的です。
107. mybatisはレイジーローディングをサポートしていますか?レイジーローディングの原理は何ですか?
Mybatisは、アソシエーションオブジェクトとコレクションオブジェクトのレイジーロードのみをサポートします。アソシエーションは1対1を指し、コレクションは1対多のクエリを指します。Mybatis構成ファイルで、レイジーロードを有効にするかどうかを構成できますlazyLoadingEnabled = true | false。
その原理は、CGLIBを使用してターゲットオブジェクトのプロキシオブジェクトを作成することです。ターゲットメソッドが呼び出されたら、a.getB()。getName()を呼び出すなど、インターセプターメソッドを入力すると、インターセプターのinvoke()メソッドはa.getB()がnull値の場合、Bオブジェクトに関連付けられた以前に保存されたsqlクエリを個別に送信し、Bをクエリして、a.setB(b)を呼び出すため、aのオブジェクトb属性に値があり、a.getB( ).getName()メソッド呼び出し。これがレイジーローディングの基本原理です。
もちろん、Mybatisだけでなく、Hibernateを含むほとんどすべてが、同じ原理でレイジーローディングをサポートしています。
108.mybatisの第1レベルのキャッシュと第2レベルのキャッシュについて教えてください。
レベル1キャッシュ:PerpetualCacheに基づくHashMapローカルキャッシュ。そのストレージスコープはセッションです。セッションのフラッシュまたはクローズ後、セッション内のすべてのキャッシュが空になり、レベル1キャッシュがデフォルトでオンになります。
第2レベルのキャッシュのメカニズムは、第1レベルのキャッシュのメカニズムと同じです。デフォルトでは、PerpetualCacheストレージとHashMapストレージも使用されます。違いは、ストレージスコープがMapper(Namespace)であり、ストレージソースをEhcacheなどでカスタマイズできることです。第2レベルのキャッシュは、デフォルトではオンになっていません。第2レベルのキャッシュを有効にするには、第2レベルのキャッシュ属性クラスを使用して、マッピングファイル<cache />で構成できるSerializableシリアル化インターフェイス(オブジェクトの状態を保存するために使用できます)を実装する必要があります。
キャッシュデータ更新メカニズムの場合、特定のスコープ(第1レベルのキャッシュセッション/第2レベルのキャッシュネームスペース)でC / U / D操作が実行されると、デフォルトで、このスコープで選択されているすべてのキャッシュがクリアされます。
109. mybatisとhibernateの違いは何ですか?
(1)Mybatisは休止状態とは異なり、MyBatisではプログラマーがSqlステートメントを作成する必要があるため、正確にはORMフレームワークではありません。
(2)Mybatisは、SQLの実行性能を厳密に制御でき、柔軟性の高いオリジナルのエコロジカルSQLを直接書き込みます。このタイプのソフトウェアの要件は頻繁に変更され、要件の変更後は迅速な出力が必要になるため、リレーショナルデータモデルの高い要件を必要としないソフトウェア開発に非常に適しています。 。ただし、柔軟性の前提は、mybatisがデータベースの独立性を実現できないことです。複数のデータベースをサポートするソフトウェアを実装する必要がある場合は、複数のsqlマッピングファイルのセットをカスタマイズする必要があり、これは大変な作業です。
(3)Hibernateは、強力なオブジェクト/リレーショナルマッピング機能と優れたデータベース独立性を備えています。リレーショナルモデルの要件が高いソフトウェアの場合、hibernateを使用して開発すると、多くのコードを節約し、効率を向上させることができます。
110. mybatisにはどのエグゼキューター(エグゼキューター)がいますか?
Mybatisには、3つの基本的な実行者(実行者)がいます。
-
SimpleExecutor:更新または選択が実行されるたびに、Statementオブジェクトが開かれ、Statementオブジェクトは使用直後に閉じられます。
-
ReuseExecutor:更新または選択を実行し、sqlをキーとして使用してStatementオブジェクトを検索し、存在する場合はそれを使用し、存在しない場合は作成します。使用後、Statementオブジェクトは閉じられませんが、次の使用のためにマップに配置されます。つまり、Statementオブジェクトを再利用することです。
-
BatchExecutor:更新を実行し(選択なし、JDBCバッチ処理は選択をサポートしません)、すべてのsqlをバッチに追加し(addBatch())、統合実行を待ちます(executeBatch())、それぞれ複数のステートメントオブジェクトをキャッシュしますステートメントオブジェクトはすべて、addBatch()が完了した後、executeBatch()バッチ処理を1つずつ待機します。JDBCバッチ処理と同じです。
111. mybatisページングプラグインの実現原理は何ですか?
ページングプラグインの基本原則は、Mybatisが提供するプラグインインターフェイスを使用してカスタムプラグインを実装し、プラグインのインターセプトメソッドで実行されるSQLをインターセプトしてから、方言の方言に従ってSQLを書き換え、対応する物理ページングステートメントと物理ページングパラメーターを追加することです。
112. mybatisはどのようにカスタムプラグインを作成しますか?
転送元:blog.csdn.net/qq_30051265/article/details/80266434
Mybatisカスタムプラグインは、Mybatisの4つの主要なオブジェクト(Executor、StatementHandler、ParameterHandler、ResultSetHandler)をインターセプトします。具体的なインターセプト方法は次のとおりです。
-
エグゼキュータ:エグゼキュータを傍受する方法(ログレコード)
-
StatementHandler:Sql構文構築の処理をインターセプトします
-
ParameterHandler:パラメーター処理をインターセプトします
-
ResultSetHandler:結果セットの処理をインターセプトします
Mybatisカスタムプラグインは、Interceptorインターフェイスを実装する必要があります。
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}
インターセプト方式:インターセプター固有の処理ロジック方式
プラグインメソッド:署名マップに基づいて動的プロキシオブジェクトを生成します
setPropertiesメソッド:Propertiesプロパティを設定します
カスタムプラグインデモ:
// ExamplePlugin.java
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget(); //被代理对象
Method method = invocation.getMethod(); //代理方法
Object[] args = invocation.getArgs(); //方法参数
// do something ...... 方法拦截前执行代码块
Object result = invocation.proceed();
// do something .......方法拦截后执行代码块
return result;
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
1つの@Interceptsを複数の@Signaturesで構成できます。@ Signatureのパラメーターは次のように定義されます。
-
type:インターセプトされたクラスを示します。これがExecutorの実装クラスです。
-
method:インターセプトの方法を示します。これがExecutorをインターセプトする更新メソッドです。
-
args:メソッドパラメータを表します。
やっと
インタビューの質問の内容はこちらです。フォローアップでさらに更新がありますので、皆様のお役に立てれば幸いです。
最後に、私はあなたに何かを言いたいと思います。私は長年働いて、他の人のために何人かの人々にインタビューしました。面接官またはリーダーの観点からであろうとなかろうと、面接のスキルと経験に加えて、優れた技術とプロジェクトの経験も彼らの切り札と自信です。一流メーカーのコアテクノロジー共有
教材を整理するのに時間がかかりました。上に投稿したのは、教材の氷山の一角です。お役に立てれば幸いです。一緒に秘密のコードを学ぶためにクリックしてください:csdn
フォローアップでより純粋な乾物の記事を共有し、本当にあなたを助けたいと思っています。あなたのサポートが私の最大の動機です!フォローしていいね!