[電源を入れる]は、共通のインタビューの質問の概要をMyBatisの

MyBatisの1とは何ですか?

(1)MyBatisのは、内部JDBCをカプセル化する半ORM(オブジェクトリレーショナルマッピング)フレームワークで、SQL文は、開発自体に集中する必要があり、その上、読み込みドライブを処理するためにエネルギーを費やすの接続を作成し、複雑なプロセス文を作成し、する必要はありません。プログラマは、SQLの実行性能を厳密に制御することができ、本来の生態SQLに直接書き込み、高い柔軟性。

(2)MyBatisのアノテーションは、ほとんどすべてのJDBCコードと手動設定パラメータを避けるために、POJOデータベース・レコードをマップするXMLまたはネイティブ構成及びマッピング情報を使用して結果セットを取得することができます。

(3)構成を介してさまざまな注釈またはXMLファイル文が一緒に実行されると、Javaオブジェクトと、SQL文の動的パラメータによって実行される最終的なマップ生成SQL文は、最後のフレームがMyBatisのによって実行され、SQLの結果をマッピングJavaオブジェクトを返します。(実行結果から、プロセスは、SQLに戻します)。

2は、利点をMybaits:

(1)SQL文ベースのプログラミングは、非常に柔軟であり、一元管理を容易にするために、SQLおよびプログラム・コードを分離、既存のアプリケーションまたはデータベース設計、XMLで記述されたSQLへの影響は生じない;の製造をサポートする、XMLタグを提供動的SQL文を再利用することができます。

(2)JDBCと比較して、大きな冗長コードJDBCを除去する、コード50%以上の量を減少させる、いかなる手動スイッチが接続されていません。

(3)多様なデータベースとの非常に良好な相溶性(MyBatisのため、JDBCサポートデータベースMyBatisのサポートように限り、JDBCデータベース接続を使用します)。

(4)ウェルスプリングと一体化することができます。

オブジェクトリレーショナルマッピングラベル、オブジェクト・リレーショナル・コンポーネントの保守サポートを提供するステップと、(5)マッピングラベル、フィールドサポートORMオブジェクトリレーショナルマッピングデータベースを提供します。

3、MyBatisのフレームワークの欠点:

書かれた作品(1)SQLステートメントは、フィールドはより多くの開発者のスキルのためのSQL文を書いて、長い時間のためにテーブルを関連付けられている特定の要件を持っている場合は特に、大規模です。

(2)SQL文が悪いポータビリティデータベースで、その結果、データベースに依存して、データベースを置き換えることはできません。

4、MyBatisのフレームワーク適用場面:

(1)MyBatisのは、SQL自体に焦点を当てた、十分に柔軟DAO層ソリューションです。

(2)高いパフォーマンス要件、またはインターネットプロジェクトとして、プロジェクトの要件の多くの変更、MyBatisのは良い選択でしょう。

 

5、HibernateでMyBatisの違いは何ですか?

MyBatisのは、自分のSQL文を書くためにプログラマーを必要とするので、異なる(1)MyBatisのと休止状態、それは、正確にORMフレームワークではありません。

(2)MyBatisのは、元の生態SQLに直接書き込む、SQLの実行を厳密に制御することができる性能、高い柔軟性、ソフトウェア開発、なぜなら需要の頻繁な変更のようなソフトウェアのリレーショナル・データ・モデルにはあま​​り要求のための理想的な、しかし迅速な達成の出力を求め変更を要求します。しかし、ソフトウェアを実装する必要が複数のデータベースをサポートしている場合、その柔軟性は、データベースに依存しないMyBatisの前提に行うことができない、カスタムマップファイルは、SQL重いワークロードを設定する必要があります。 

(3)強力なオブジェクト/リレーショナルマッピング機能を休止状態休止状態、開発者はコードを大幅に節約し、効率を向上させることができれば、高リレーショナルモデルは、ソフトウェアを必要とするために、データベースに依存しないで良いです。 

 

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

#{} $ {}文字列が交換され、事前にコンパイラプロセスです。

MyBatisの#{}を処理するとき、?;呼び出しセット割当方法のPreparedStatementとSQL番号#{}になります

MyBatisの$ {}を処理するときに、{} $は、変数の値を置換することです。

効果的に、SQLインジェクションを防ぐシステムのセキュリティを向上させることができる。#{}を使用します。

 

エンティティクラスの属性名のフィールド名とテーブルが同じでないとき7、どのように?

全会一致で、SQL文のクエリの別名でフィールド名の定義を採用しているので、属性名の別名とエンティティクラスのフィールド名:第一種。

    <SELECT ID = "selectorder" ParameterTypeが= "INT" = resultetype "me.gacl.domain.order">
SELECT IDのORDER_ID、ORDER_NOあるOrderNo、order_price ID =#{}価格ORDER_IDフォーム注文;
</ SELECT>
第二のタイプ<このresultMap>ずつマッピング関係のエンティティクラスのフィールド名と属性名に1。

<SELECT ID = "getOrder"のParameterType = "INT"このresultMap = "orderresultmap">
SELECT * ORDER_ID IDから受注=#{}
</ SELECT>

<このresultMapタイプ= "me.gacl.domain.order" ID =「orderresultmap 「>
<! - > -プライマリキーフィールドマップするid属性と
<idプロパティ=」ID「列=」ORDER_ID「>

<! -非プライマリキーフィールドをマップするために、結果の属性を持つが、エンティティクラスのプロパティは、属性名、列のデータテーブル属性- >
<プロパティ結果= "あるOrderNo"欄= "ORDER_NO" />
"価格" <プロパティ結果=列= "order_price" />
</ reslutMap>
 

8、文の書き方のようなあいまいクエリ?

項目1:JavaコードでSQLワイルドカードを追加します。

wildcardname =文字列"SMI %%";
リスト<名前> = mapper.selectlike名(wildcardname)

<SELECT ID = "selectlike">
SELECT *#{値}のようなバーからfooは
</ SELECT>
2種:ワイルドカードをステッチSQLステートメントは、SQLインジェクションが発生します

文字列wildcardname =「SMI」。
リスト<名前>名前= mapper.selectlike(wildcardname)。

<ID =」selectlike」を選択>
     SELECT * FROM FOOからバー"%"など#{値} "%"を
</選択>
 

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

DAO、すなわちマッパーインターフェースをインターフェースします。インタフェースの完全修飾名は、名前空間のマッピング・ファイルの値であり、インターフェースメソッドの名前、ID値マップは、ファイルマッパーステートメントである、インターフェースメソッドのパラメータは、パラメータはSQLに渡されます。

文字列の連結キー値としてメソッド呼び出しインターフェース、インターフェース名+完全に修飾されたメソッド名が一意MapperStatementを配置する際マッパー、実装クラスをインターフェースしません。MyBatisの中で、それぞれが<挿入>、<選択> <更新>は、<削除>タグはMapperStatementオブジェクトに解決されます。

たとえば:com.mybatis3.mappers.StudentDao.findStudentById、あなたはMapperStatementのid findStudentById以下com.mybatis3.mappers.StudentDaoのための一意の名前空間を見つけることができます。

完全修飾名+メソッド名を保存し、戦略を探すために使用しているため、この方法でマッパーインタフェースは、オーバーロードされていません。JDKダイナミックプロキシを動作マッパーインターフェースは、プロキシオブジェクトは、SQL MyBatisの実行を表現MapperStatementの実施に有利なようにインタフェースメソッドをインターセプトするプロキシインタフェース生成マッパー用JDKの動的プロキシオブジェクトプロキシを使用し、SQLの実行は、結果を返します。

 

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

        ページングを使用してMyBatisのRowBoundsオブジェクトは、それはむしろ物理ページより、実行するように設定されたメモリページングResultSetの結果のためです。パラメータを直接物理ページ内の物理ページに書き込むことができ、SQL関数は、物理ページのタブウィジェットを完了するために使用することができる達成されます。

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

 

11、MyBatisのは、SQLパッケージを実行する方法であり、対象物と戻りの結果は?マッピングの形式は何ですか?

最初は、属性およびオブジェクト・データベースの列名の間のマッピングを定義する、<このresultMap>タグを使用することです。

第二の機能は、列エイリアス名をオブジェクトのプロパティとして記述され、別名SQLカラムを使用することです。

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

 

12、どのように一括挿入を実行するには?

まず、シンプルなinsert文を作成します。

<INSERT ID = "insertname">
    名前(名)の値(#{値})。INSERT INTO
</ INSERT>
このJavaコードのように挿入され、次のバッチを実行して:

リスト<文字列>名=新しいArrayListを();
names.add(「フレッド」);
names.add(「バーニー」);
names.add(「ベティ」);
names.add(「ウィルマ」)。

//注意这里executortype.batch
SQLSESSION SQLSESSION = sqlsessionfactory.opensession(executortype.batch)。
試す{
namemapperマッパー= sqlsession.getmapper(namemapper.class)。
(文字列名:名)のための{
mapper.insertname(名);
}
sqlsession.commit()。
}キャッチ(例外e){
e.printStackTrace();
sqlSession.rollback(); 
Eを投げます。 
    }
    最後に{
    sqlsession.close()。
}
 

13、どのように自動的に生成された(マスター)キーを取得するには?

INT挿入方法は、常に挿入された行の数を表す値を返します。

自己成長戦略場合は、メソッドの実装後の挿入で自動的に生成されたキーが渡されたパラメータオブジェクトに設定することができます。

例:

<ID =」insertname」usegeneratedkeys =」真」keypropertyは=」ID」を挿入>
名前(名)の値(#{名前})に挿入
</インサート>
    名名=新しい名前()。
name.setname(「フレッド」);

int型の行= mapper.insertname(名);
//完成后、ID已经被设置到对象中
のSystem.out.println(+行「=挿入された行」)。
System.out.println(「生成されたキー値=」+ name.getid())。
 

14、どのようにマッパーで複数のパラメータを渡すには?

(1)第一:
//関数DAO層
パブリックUserselectUser(文字列名、文字列エリア); 
//対応するXML、#{0}は、受信したパラメータDAO層の第1の代表であり、{#1}第二層のDAOパラメータ代表的には、複数のパラメータは、後で一貫性を加えることができます。
<SELECT ID = "selectUser"このresultMap = "BaseResultMap"> 
SELECT * fromuser_user_t whereuser_name = {0}#=#{anduser_area 1} 
</ SELECT> 

(2)第二:使用@param注釈:
パブリックインターフェイスUserMapper {
ユーザーselectuser (パラメータ(「hashedpassword」)文字列hashedpassword @ @param(「ユーザ名」)文字列名は、);
}
次のように(マップの推奨パッケージは、単一のパラメータとしてマッパに渡される)、XMLでそのまま使用することができる:
<SELECT = ID "selectuser" resultTypeと= "ユーザー">
SELECT ID、ユーザ名、hashedpassword
some_tableから
ユーザ名=#{}ユーザー名
とhashedpassword hashedpassword} = {#
</ SELECT>

(3)第3:複数のパラメータは、地図、カプセル化
の試行が{
// .SQL ID名前空間セグメントマッピングファイルは、あなたがSQLに対応するマッピングファイルを呼び出すことができます
。//私たちの二つ以上のパラメータ以降、および唯一のObject引数を収集する方法であって、私たちは、パラメータをロードするために私たちの地図を使っセット
地図<文字列、オブジェクト> =新しい新しい地図HashMapを();
map.put(「スタート」、スタート);
map.put(「エンド」、エンド);
; sqlSession.selectList( "StudentID.pagination"、マップ)を返す
}キャッチ(例外E){
e.printStackTrace()を;
sqlSession.rollback();
スローEを;}
最後に{
MybatisUtil.closeSqlSession();
}
 

15、MyBatisの動的SQLの使用は何ですか?原則の実装?私たちは、動的SQLを持っていますか?

MyBatisの動的SQL、XMLが動的SQLタグの形式で作成されたマップファイルであってもよく、実行は、発現の動的モザイクSQL値に応じて完全な論理判定原理及び機能です。

選択した| |場合|とき|そう|バインド設定| |場所| foreachのトリム:MyBatisの動的SQLタグの9種類を提供しています。

 

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

<このresultMap>、<なparameterMap>、<SQL>、<含まれ>、<selectKey>、一緒にダイナミックラベルSQL 9、を有する前記<SQL> SQL断片のタグ、断片導入SQLは<含める>タグ、<自動インクリメントの主キーをサポートしていませんselectKey>タグ生成戦略。

 

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

構成された名前空間が存在しない場合は、IDが繰り返すことはできません。別のXMLマッピングファイルには、コンフィギュレーションの名前空間場合は、IDを繰り返すことができます。

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

 

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

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

 

19は、多くのクエリに1の1、1に関連付けられていますか? 

<マッパーの名前空間= "com.lcb.mapping.userMapper"> 
<! -協会一对一关联查询- > 
<ID = "はgetClass"のParameterType = "int型"このresultMap = "ClassesResultMap"を選択> 
を選択*クラスcから、教師T c.teacher_id = t.t_idとc.c_id =#{ID} 
</選択> 

<このresultMapタイプ= "com.lcb.user.Classes" ID = "ClassesResultMap"> 
<! -实体类的字段名和数据表的字段名映射- > 
<idプロパティ= "ID"列= "C_ID" /> 
<結果プロパティ= "名前"欄= "c_name" /> 
<関連プロパティ= "教師"のJavaType = "COM .lcb.user.Teacher "> 
<idプロパティ=" ID "列= "t_id"/> 
<resultプロパティ=" 名"欄=" t_name「/>
</協会または> 
</このresultMap> 


<! -コレクション-多くのクエリに関連付けられています- > 
<ID = "getClass2"のParameterType = "int型"このresultMap = "ClassesResultMap2"を選択> 
クラスc、教師トンSELECT * FROMを、学生のどこc.teacher_id = t.t_idとc.c_id = s.class_idとc.c_id = #{ID} 
</選択> 

<このresultMapタイプ= "com.lcb.user.Classes" ID = "ClassesResultMap2"> 
<idプロパティ= "ID"列= "C_ID" /> 
<結果プロパティ= "名前"欄= "c_name" /> 
<関連プロパティ= "教師"のJavaType = "com.lcb.user.Teacher"> 
<idプロパティ= "ID"列= "t_id" /> 
= "t_name" <結果プロパティ= "名前"欄/> 
</関連> 

<コレクションプロパティ= "学生" ofType = "com.lcb.user.Student">
<idプロパティ= "ID"列= "S_ID" /> 
<結果プロパティ= "名前"欄= "s_name" /> 
</コレクション> 
</このresultMap> 
</マッパー> 
 

20、MyBatisの1を達成するためのいくつかの方法が具体的にどのように動作する?ありますか?

そして関節問い合わせネストされたクエリを有し、クエリは、複数のテーブル関節問い合わせを組み合わせ問い合わせ回だけ、クラスの内部このresultMapノードのアソシエーションの設定を配置することによって完了することができるされています。

ネストされたクエリは、select属性のクエリ構成を通じて内部、外部キーテーブルIDの結果によれば、テーブルを確認し、さらにテーブルにデータクエリ内部だけでなく、関連構成ではなく、別のテーブルです。

 

21、操作方法を、達成するための多くの方法がありますMyBatisの?

        関節の問い合わせおよびネストされたクエリがあります。複合クエリーテーブルいくつかの関節の問い合わせ、問い合わせ回のみ完了することができ、コレクションのノード内でこのresultMap多くのクラスを配置することで、ネストされたクエリを確認するためのテーブルで、外部キーID内のテーブルの結果、さらに、データのクエリ内のテーブルに、だけでなく、コレクションを配置することが、さらにルックアップテーブルを選択ノード構成によります。

 

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

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

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

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

 

 23、MyBatisのプライマリ、セカンダリキャッシュ:

1)キャッシュ:キャッシュのすべては、デフォルトのキャッシュによって、セッションに空になり、フラッシュまたは終了後にセッション、セッションの範囲を格納PerpetualCacheローカルキャッシュを、ベースのHashMap。

2)二次キャッシュとは、同じメカニズムをキャッシュするだけでなく)デフォルトPerpetualCache、HashMapのは、それは、マッパー(名前空間などの異なるスコープに格納され、格納された使用、及びそのようなEhcacheのようなカスタム貯蔵源であってもよいです。既定の二次キャッシュ、二次キャッシュを開くために、開放されていない、(オブジェクトの状態を保存するために使用される)シリアライズクラスシリアライゼーションインタフェースを実装するのに必要なプロパティを使用して二次キャッシュは、それがマッピングファイルに配置することができる<キャッシュ/>。

3)データキャッシュ更新メカニズムのため、デフォルトの後(一定の範囲内のキャッシュセッション/二次キャッシュ名前空間)をC / U / D動作を行う際には明らかであろうすべてのキャッシュの範囲を選択します。

 

24、MyBatisのの結合インタフェースは何ですか?どのような実装?

結合界面は、任意インターフェイスMyBatisの定義、及び、インターフェースメソッドSQL文およびバインドの内側にある、我々は、直接インタフェースメソッドを呼び出すことができるので、提供元のメソッドSQLSESSIONに比べて、我々は、より柔軟なオプションと設定を持つことができ。

インタフェースは、次の2つの方法で実装バインディング、1はバインディングアノテーションを介して行われ、それがバインドするために、上記の方法では、インタフェースのSQL文が含まれている選択し、@のアップデートや他の注釈、@追加することであり、もう一つは、内部のXMLでSQLを書くことですバインドするために、この場合には、インタフェースのフルパス名でなければなりません名前空間内のXMLマッピングファイルを指定します。バインディングアノテーションを使用した場合と、より複雑なSQL文通常、XMLはより多くを結合して、XMLバインディングを使用した場合と、SQL文は、簡単です。

MyBatisのマッパー・インタフェース・コールを使用する必要があり25、?

①各SQLマッパー名と同じmapper.xmlで定義されたインタフェースメソッドのIDが、
同じタイプのParameterType SQL各入力パラメータの種類とmapper.xml②マッパーインターフェースメソッドが定義され、
出力パラメータタイプインターフェース方法③マッパーSQL同じタイプと定義されている各resultTypeとのmapper.xml;
④Mapper.xmlネームスペースファイル即ちクラスパスマッパーインターフェース。

書き込むには、いくつかの方法を持っている26、マッパー、?

最初:インターフェースクラスの継承SqlSessionDaoSupport:このメソッドを使用するには、インターフェイスマッパー、マッパーインタフェースクラス、mapper.xmlファイルを記述する必要があります。
(1)sqlMapConfig.xml位置mapper.xmlに配置された
<マッパーによって>
    <リソースマッパー= "アドレスmapper.xmlファイル" />
    <リソースマッパー= "アドレスmapper.xmlファイル" />
</マッパによって>
( 2)インターフェイスマッパーを定義
(3)集積実装クラスSqlSessionDaoSupportの
マッパープロセスデータはCRUD this.getSqlSession(ことができます)。
(4)Spring構成
<ビーンID = ""クラス= " マッパーインターフェース実装">
    <プロパティ名= "SqlSessionFactory" REF = "SqlSessionFactory"> </プロパティ>
</豆>

 
第二:使用org.mybatis.spring.mapper.MapperFactoryBean:
(1)位置mapper.xml sqlMapConfig.xmlに配置され、同じ名前場合と同じディレクトリにmapper.xmlとインタフェースをmappreは、そこに設定することはできません
<マッパーによって>
    <マッパーリソース=「アドレスmapper.xmlファイル」/>
    <マッパーリソース=「アドレスmapper.xmlファイル」/>
</マッパによって>
(2)インターフェイスマッパーを定義:
①mapper.xmlマッパーは、名前空間でありますインターフェイスのアドレス
一致mapper.xmlで定義されたID②mapperインターフェースのステートメントとメソッド名が
③Spring定義
<ビーンID =「」クラス=「org.mybatis.spring.mapper.MapperFactoryBean」>
    <プロパティ名=「mapperInterface "値="マッパーインターフェースアドレス"/> 
    <プロパティ名=" SqlSessionFactory "REF =" SqlSessionFactory「/> 
</豆>


第三:使用マッパースキャナ:
(1)mapper.xmlファイルの調製:
名前空間アドレスマッパーインターフェースをmapper.xml;
mapper.xml一貫したIDで定義されたマッパーインターフェース及び方法名前の声明;
ならsqlMapConfig.xmlで構成されていない中でのインターフェイスのmapper.xmlとマッパー名前が一致しています。 
(2)インターフェイスマッパーを定義:
mapper.xmlインタフェース名と一致するファイル名マッパー、および同じディレクトリ注
:マッパースキャナの(3)
<beanクラス=「org.mybatis.spring.mapper.MapperScannerConfigurer」 >
    <プロパティ名=「basePackage」値=「マッパーインターフェースパケットアドレス」> </プロパティ>
    <プロパティ名=「sqlSessionFactoryBeanName」値=「SqlSessionFactory」/> 
</豆>
スプリングから容器後にスキャナを用いて(4)マッパーを実装するオブジェクトを取得します。

 

27、プラグインを作成する方法と同様に、MyBatisのプラグインを概説した動作原理。

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

プラグインを書く:MyBatisのはインターセプタインターフェースと複製インターセプト()メソッドを達成した後、プラグインにメモを書く、コンフィギュレーション・ファイルのプラグインで、あなたの設定を記述することを忘れないでください、覚えて、どのインタフェース傍受するためにどの方法を指定します。
--------------------- 
著者:a745233700 
出典:CSDN 
オリジナルます。https://blog.csdn.net/a745233700/article/details/80977133 

おすすめ

転載: www.cnblogs.com/gaobing1252/p/11110657.html