JAva面接のMybatis編


一、Mybatisとは何ですか.
1、Mybatisは半ORM(オブジェクト関係マッピング)フレームワークで、内部にJDBCがカプセル化されており、開発時にはSQL文自体に注目するだけで、ロードドライバ、接続の作成、statementの作成などの煩雑なプロセスを処理するのに苦労する必要はありません.
2、MyBatisは、XMLまたは注釈を使用してオリジナル情報を構成およびマッピングし、POJOをデータベース内のレコードにマッピングすることができ、ほとんどのJDBCコードと手動でパラメータを設定し、結果セットを取得することを回避します.
 
二、長所と短所の分析
メリット:
1、SQL文に基づいてプログラミングして、かなり柔軟で、アプリケーションあるいはデータベースの既存の設計に対していかなる影響をもたらすことはできなくて、SQLはXMLの中で書いて、sqlとプログラムコードの結合を解除して、統一的に管理しやすいです;動的SQL文の記述をサポートし、再利用可能なXMLラベルを提供します.
2、JDBCに比べて、50%以上のコード量を減らし、JDBCの大量の冗長コードを排除し、手動スイッチ接続を必要としない.
3、様々なデータベースとの互換性が優れている(MyBatisはJDBCを使用してデータベースに接続しているため、JDBCがサポートしているデータベースMyBatisがサポートしている限り).
4、Springとうまく統合できる;
5、マッピングラベルを提供し、オブジェクトとデータベースのORMフィールド関係のマッピングをサポートする.オブジェクトリレーションシップマッピングラベルを提供し、オブジェクトリレーションシップコンポーネントのメンテナンスをサポートします.
欠点:
1、SQL文の作成作業量が多く、特にフィールドが多く、関連表が多い場合、開発者がSQL文を作成する基礎に一定の要求がある.
2、SQL文はデータベースに依存し、データベースの移植性が悪く、勝手にデータベースを交換できない.
 
三、MyBatisフレームワーク適用の場合:
1、MyBatisはSQLそのものに専念し、十分に柔軟なDAO層ソリューションである.
2、性能に対する要求が高い、あるいは需要の変化が多いプロジェクト、例えばインターネットプロジェクト、MyBatisは良い選択です.
 
四、#{}と${}の違いは何ですか.
1、#{}はプリコンパイル処理であり、${}は文字列置換である.
2、Mybatisは#{}を処理する時、sqlの中の#{}を?番号、PreparedStatementのsetメソッドを呼び出して値を割り当てます;
3、Mybatisは${}を処理するとき、${}を変数の値に置き換えます.
4、使用#{}はSQL注入を効果的に防止し、システムの安全性を高めることができる.
 
五、エンティティクラスの属性名とテーブルのフィールド名が異なる場合、どうすればいいですか.
クエリーのsql文でフィールド名の別名を定義することで、フィールド名の別名とエンティティクラスの属性名を一致させます.


 
六、Mybatisはどのようにsql実行結果をターゲットオブジェクトにカプセル化して返しますか?どのようなマッピング形式がありますか?
1.ラベルを使用して、データベース列名とオブジェクト属性名のマッピング関係を1つずつ定義します.
2、sql列の別名機能を使用して、列の別名をオブジェクト属性名として書きます.カラム名とアトリビュート名のマッピング関係がある場合、Mybatisは反射によってオブジェクトを作成し、反射によってオブジェクトに反射されたアトリビュートを使用して1つずつ値を割り当てて返します.マッピング関係が見つからないアトリビュートは、値を割り当てることができません.
 
七、Mybatisダイナミックsqlは何の役に立ちますか?原理を実行しますか?どのようなダイナミックsqlがありますか?
1、MybatisダイナミックsqlはXmlマッピングファイル内で、ラベルの形式でダイナミックsqlを書くことができ、実行原理は式の値に基づいて論理判断を完成し、ダイナミックにsqlをつなぐ機能である.
2、Mybatisは9種類の動的sqlラベルを提供した:trim|where|set|foreach|if|choose|when|otherwise|bind.
 
八、Mybatisは遅延ロードをサポートしていますか?サポートされている場合、その実現原理は何ですか?
1、Mybatisはassociation関連オブジェクトとcollection関連集合オブジェクトの遅延ロードのみをサポートし、associationは一対一を指し、collectionは一対多のクエリーを指す.Mybatisプロファイルでは、lazyLoadingEnabled=true|falseの遅延ロードを有効にするかどうかを設定できます.
2、原理は、CGLIBを用いるターゲットオブジェクトのプロキシオブジェクトを作成し、ターゲットメソッドを呼び出すと、a.getB()を呼び出すなどのブロッキングメソッドに入る.getName()は、インターセプタinvoke()メソッドがa.getB()がnull値であることを発見すると、予め保存するクエリー関連Bオブジェクトのsqlを個別に送信し、Bをクエリーしてa.setB(b)を呼び出し、aのオブジェクトb属性に値がある、a.getB()を完了する.getName()メソッドの呼び出し.これが遅延ロードの基本原理です.
 
九、Mybatisの一級、二級キャッシュ:
1、一級キャッシュ:PerpetualCacheに基づくHashMapローカルキャッシュ.そのストレージの役割ドメインはSessionである.Session flushまたはcloseの後、そのSessionの中のすべてのCacheは空になり、デフォルトで一級キャッシュを開く.
2、二次キャッシュは一次キャッシュと同じメカニズムであり、デフォルトではPerpetualCache、HashMapストレージを採用しているが、そのストレージの役割ドメインがMapper(Namespace)であり、Ehcacheなどのストレージソースをカスタマイズすることができる.デフォルトでは、二次キャッシュは開かれません.二次キャッシュを開くには、二次キャッシュ属性クラスを使用してSerializableシーケンス化インタフェース(オブジェクトの状態を保存するために使用可能)を実装し、そのマッピングファイルで構成する必要があります.
3.キャッシュデータの更新メカニズムについて、ある役割ドメイン(一級キャッシュセッション/二級キャッシュNamespaces)のC/U/D操作が行われた後、デフォルトでは、その役割ドメインの下のすべてのselectのキャッシュがclearされる.
 
十、MyBatisのmapperインタフェースを使用して呼び出すときにどのような要求がありますか?
1、Mapperインタフェースの方法名とmapper.xmlで定義された各sqlのidは同じである.
2、Mapperインタフェース方法の入力パラメータタイプとmapper.xmlで定義された各sqlのparameterTypeのタイプは同じです.
3、Mapperインタフェース方法の出力パラメータタイプとmapper.xmlで定義されたsqlごとのresultTypeのタイプは同じです.
4、Mapper.xmlファイルのnamespaceはmapperインタフェースのクラスパスです.
 
以上、Mybatisの基本的な面接知識をまとめました.