2023 年の MyBatis Java 面接の質問

継続的に更新されるコンテンツには、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux およびその他のテクノロジー スタック (Dididi) が含まれます。今後も更新されますので、「いいね!」を忘れないでください。フォローして、3 つのコンボを共有します)。

MyBatis のインタビューの質問: (最後に従うと完全な回答が得られます)

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

1. Mybatis は、内部的に JDBC をカプセル化する半 ORM (オブジェクト リレーショナル マッピング) フレームワークです。

SQL ステートメント自体に注意するだけでよく、ドライバーのロード、接続の作成、作成などにエネルギーを費やす必要はありません。

ステートメントやその他の複雑なプロセス。プログラマはオリジナルのエコロジカル SQL を直接記述し、SQL の実行を厳密に制御できます。

有能で柔軟性が高い。

2. MyBatis は、XML またはアノテーションを使用してネイティブ情報を構成およびマッピングし、POJO をデータにマッピングできます。

ライブラリに記載されているように、ほとんどすべての JDBC コード、パラメータの手動設定、結果セットのフェッチが回避されます。

3. XML ファイルまたはアノテーションを通じて実行されるさまざまなステートメントを構成し、

Java オブジェクトとステートメント内の SQL の動的パラメーターがマップされて、最終的に実行される SQL ステートメントが生成されます。

その後、mybatis フレームワークが SQL を実行し、結果を Java オブジェクトにマップして返します。(SQLの実行から復帰まで)

結果を返すプロセス)。

2. マイベイトのメリット:

1. SQL ステートメント プログラミングに基づいており、非常に柔軟であり、アプリケーション プログラムやデータベースの既存の設計に影響を与えません。

影響なし。SQL は XML で記述され、SQL とプログラム コードを分離して統合管理し、XML を提供します。

ラベル、動的 SQL ステートメントの作成をサポートし、再利用できます。

2. JDBCと比較してコード量を50%以上削減し、JDBCの多くの冗長コードを排除します。

手動スイッチ接続が必要です。

3. さまざまなデータベースとの良好な互換性 (MyBatis はデータベースへの接続に JDBC を使用するため、

JDBC がサポートするデータベース MyBatis がサポートされています)。

4. Spring とうまく統合できます。

5. マッピング タグを提供し、オブジェクトとデータベース間の ORM フィールド リレーショナル マッピングをサポートし、オブジェクト リレーショナル マッピングを提供します。

オブジェクト リレーショナル コンポーネントのメンテナンスをサポートするタグ。

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

1. SQL ステートメントを作成する作業負荷は比較的大きく、特にフィールドが多く、関連するテーブルが多数ある場合、開発者が SQL ステートメントを作成するのは非常に困難です。

SQL ステートメントの知識には特定の要件があります。

2. SQL ステートメントはデータベースに依存しているため、データベースの移植性が低く、データベースを自由に置き換えることができません。

4. MyBatis フレームワークが適用される場合:

1. MyBatis は SQL 自体に焦点を当てており、十分に柔軟な DAO 層ソリューションです。

2. インターネット プロジェクトなど、高いパフォーマンス要件があるプロジェクト、または要件が頻繁に変更されるプロジェクトの場合、MyBatis が

良い選択。

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

1. Hibernate とは異なり、Mybatis は正確には ORM フレームワークではありません。

プログラマーは自分で SQL ステートメントを作成します。

2. Mybatis は独自のエコロジー SQL を直接記述します。これは、SQL の実行パフォーマンスを厳密に制御でき、高い柔軟性と非常に優れています。

このようなソフトウェアの要件は頻繁に変更されるため、リレーショナル データ モデルに対する要件がそれほど高くないソフトウェア開発に適しています。

変化を求めるには、結果を迅速に出力する必要があります。ただし、柔軟な前提として、mybatis はデータベースの独立性を実現できないということです。

複数のデータベースをサポートするソフトウェアを実装する必要がある場合は、複数の SQL マッピング ファイルのセットをカスタマイズする必要があり、これは大きな作業負荷になります。

3. Hibernate には、強力なオブジェクト/リレーショナル マッピング機能、優れたデータベース独立性、およびリレーショナル モデルに対する高い要件があります。

ソフトウェアを休止状態で開発すると、多くのコードが節約され、効率が向上します。

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

#{}是预编译处理,${}是字符串替换。 

Mybatis が #{} を処理するとき、SQL 内の #{} を ? 記号に置き換えて、PreparedStatement の

値を割り当てる set メソッド。

Mybatis は ${} を処理するときに、${} を変数の値に置き換えます。

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

7. エンティティクラスの属性名がテーブルのフィールド名と異なる場合はどうすればよいですか?

タイプ1: クエリのSQL文にフィールド名の別名を定義することで、フィールド名とエンティティクラスの別名を定義する

属性名は同じです。

<select id=”selectorder” parametertype=”int” resultetype=” me.gacl.domain.order”> select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; </select> 

タイプ 2: フィールド名とエンティティ クラスの属性名の間の 1 対 1 の関係をマッピングします。

<select id="getOrder" parameterType="int" resultMap="orderresultmap"> select * from orders where order_id=#{id} </select> <resultMap type=”me.gacl.domain.order” id=”orderresultmap”> <!–用 id 属性来映射主键字段–> <id property=”id” column=”order_id”> <!–用 result 属性来映射非主键字段,property 为实体类属性名,column 为数据表中的属性–> <result property = “orderno” column =”order_no”/> <result property=”price” column=”order_price” /> </reslutMap> 

8. ファジークエリのようなステートメントを記述するにはどうすればよいですか?

タイプ 1: Java コードに SQL ワイルドカードを追加します。

string wildcardname = “%smi%”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like #{value} </select> 

タイプ 2: SQL ステートメント内でワイルドカードを結合すると SQL インジェクションが発生します

string wildcardname = “smi”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like "%"#{value}"%" </select> 

9. 通常、Xml マッピング ファイルには、それに対応する Dao インターフェイスが書き込まれます。

すみません、この Dao インターフェースの動作原理は何ですか? Daoインターフェースのメソッド、

パラメーターが異なる場合にメソッドをオーバーロードできますか?

Dao インターフェイスは Mapper インターフェイスです。インターフェイスの完全修飾名は、マッピング ファイル内の名前空間の値です。

インターフェイスのメソッド名は、マッピング ファイル内のマッパーのステートメントの ID 値です。

パラメータは SQL に渡されるパラメータです。

Mapper インターフェースには実装クラスがありません。インターフェースのメソッドを呼び出す場合は、インターフェースの完全名 + メソッド名の連結になります。

この文字列は、MapperStatement を一意に見つけるためのキー値として使用されます。

Mybatis では、各 ,,, ラベルが MapperStatement オブジェクトに解析されます。

例:

com.mybatis3.mappers.StudentDao.findStudentById。

見つかる名前空間は com.mybatis3.mappers.StudentDao のみです。

次の ID は、findStudentById の MapperStatement です。

Mapper インターフェイスのメソッドは、保存および検索にフルネーム + メソッド名を使用するため、オーバーロードできません。

戦略を見つけてください。

Mapper インターフェイスの動作原理は JDK 動的プロキシです。

Mybatis が実行されると、JDK ダイナミック プロキシを使用して Mapper インターフェイスのプロキシ オブジェクト プロキシを生成し、プロキシ オブジェクトがインターフェイス メソッドをインターセプトします。

MapperStatementで表されるSQLを実行し、SQLの実行結果を返します。

10. Mybatis はどのようにページネーションを行うのですか? ページネーションプラグインの原理は何ですか?

Mybatis はページ分割に RowBounds オブジェクトを使用します。これは ResultSet 結果セットに実装されています。

物理ページの代わりにページを保存します。

SQL で物理ページングを含むパラメーターを直接記述して物理ページング機能を完了することも、ページング プラグインを使用して物理ページングを完了することもできます。

ページネーション プラグインの基本原理は、Mybatis が提供するプラグイン インターフェイスを使用してカスタム プラグインを実装することです。

プラグインのインターセプトメソッドで実行するSQLをインターセプトし、SQLを書き換えて、方言に従って対応する物理ページングステートメントと物理ページングパラメータを追加します。

11. Mybatis はどのように SQL 実行結果をターゲット オブジェクトにカプセル化して返しますか?

マッピング形式とは何ですか?

1 つ目は、タグを使用して、データベースの列名とオブジェクトの属性名の間のマッピング関係を 1 つずつ定義する方法です。

2 つ目は、SQL カラムの alias 関数を使用し、カラムのエイリアスをオブジェクトの属性名として書き込む方法です。

Mybatis は、カラム名とプロパティ名のマッピング関係を利用して、リフレクションを通じてオブジェクトを作成すると同時に、リフレクションを使用してオブジェクトのプロパティに値を代入し、それらを 1 つずつ返します。割り当てることはできません。

12. バッチ挿入を実行するにはどうすればよいですか?

まず、単純な挿入ステートメントを作成します。

<insert id=”insertname”> insert into names (name) values (#{value}) </insert> 

次に、Java コードで次のようにバッチ挿入を実行します。

list < string > names = new arraylist(); names.add(“fred”); names.add(“barney”); names.add(“betty”); names.add(“wilma”); // 注意这里 executortype.batch sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch); try { namemapper mapper = sqlsession.getmapper(namemapper.class); for (string name: names) { mapper.insertname(name); } sqlsession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); throw e; } finally { sqlsession.close(); } 

13. 自動生成された (主) キーの値を取得するにはどうすればよいですか?

insert メソッドは常に、挿入された行数を表す int 値を返します。

自己成長戦略が採用されている場合、挿入メソッドの実行後に、自動的に生成されたキー値を受信パラメーター オブジェクトに設定できます。

例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=” id”> insert into names (name) values (#{name}) </insert> name name = new name(); name.setname(“fred”); int rows = mapper.insertname(name); // 完成后,id 已经被设置到对象中 system.out.println(“rows inserted = ” + rows); system.out.println(“generated key value = ” + name.getid()); 

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

1. 最初のタイプ:

DAO層の機能。

public UserselectUser(String name,String area); 

対応する xml の場合、#{0} は、dao レイヤーの最初のパラメーターが受信されることを意味します。

{1} は dao レイヤーの 2 番目のパラメーターを表し、後でさらにパラメーターを追加できます。

<select id="selectUser"resultMap="BaseResultMap"> select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1} </select> 

2. 2 番目のタイプ: @param アノテーションを使用します。

public interface usermapper { user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword); } 

次に、次のように XML で使用できます (マップとしてカプセル化し、単一のパラメーターとしてマッパーに渡すことをお勧めします)。

<select id=”selectuser” resulttype=”user”> select id, username, hashedpassword from some_table where username = #{username} and hashedpassword = #{hashedpassword} </select> 

3. 3 番目のタイプ: 複数のパラメータが Maptry { にカプセル化されます。

//マッピング ファイルの名前空間。SQL フラグメントの ID。対応するマッピング ファイルで SQL を呼び出すことができます。

// パラメータが 3 つ以上あり、メソッド内に Object パラメータ コレクションが 1 つしかないため、 .

Map コレクションを使用してパラメータを読み込みます。

Map < String, Object > map = new HashMap(); map.put("start", start); map.put("end", end); return sqlSession.selectList("StudentID.pagination", map); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); throw e; } finally { MybatisUtil.closeSqlSession(); } 

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

Mybatis 動的 SQL は、実行原理である XML マッピング ファイル内のタグの形式で動的 SQL を記述することができます。

論理的な判断を完了させ、式の値に応じてSQLを動的につなぎ合わせる機能です。

Mybatis は 9 つの動的 SQL タグを提供します。

トリム | ここで | セット | それぞれ 場合 | 選択 | いつ | それ以外の場合 | 練る。

16. XML マッピング ファイルには、一般的な select|insert|updae|delete タグの他にどのようなタグがありますか?

答え:、、、、

、動的 SQL の 9 つのタグ (SQL フラグメント タグを含む) が渡されます。

タグでは、自動インクリメントをサポートしない主キーのポリシー タグを生成する SQL フラグメントが導入されています。

サイン。

17. Mybatis の Xml マッピング ファイルでは、異なる Xml マッピング ファイルの ID を繰り返すことができますか?

さまざまな XML マッピング ファイルでは、名前空間が構成されている場合、ID を繰り返すことができます。

名前空間が設定されていない場合、ID を繰り返すことはできません。

理由は、namespace+id が Map のキーとして使用されるためです。

名前空間がない場合はidのみが残り、idが重複するとデータが上書きされます。

名前空間を使用すると、自然な ID を繰り返すことができます。名前空間は異なります。名前空間 + ID は自然です。

それも違います。

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

Hibernate は完全に自動化された ORM マッピング ツールであり、Hibernate を使用して関連するオブジェクトまたは関連付けをクエリします。

オブジェクトを収集する場合、オブジェクト関係モデルに従って直接取得できるため、完全に自動化されます。

Mybatis が関連オブジェクトまたは関連コレクション オブジェクトをクエリする場合、SQL を手動で記述する必要があるため、半自動 ORM マッピング ツールと呼ばれます。

19. 1 対 1、1 対多の関連クエリ?

<mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> <select id="getClass" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type="com.lcb.user.Classes" id="ClassesResultMap"> <!-- 实体类的字段名和数据表的字段名映射 --> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.lcb.user.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap> <!--collection 一对多关联查询 --> <select id="getClass2" parameterType="int" resultMap="ClassesResultMap2"> select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id} </select> <resultMap type="com.lcb.user.Classes" id="ClassesResultMap2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.lcb.user.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> <collection property="student" ofType="com.lcb.user.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection> </resultMap> </mapper> 

20. MyBatis は 1 対 1 を実装する方法が何通りありますか? それはどのように機能しますか?

結合クエリとネストクエリがあり、結合クエリは複数のテーブルの結合クエリであり、一度だけクエリが実行されます。

resultMap で関連ノードを構成し、1 対 1 クラスを構成して完了します。

ネストされたクエリは、最初にテーブルをチェックし、次にこのテーブルの結果の外部キー ID に従って別のテーブルに移動します。

クエリ データも関連付けによって構成されますが、別のテーブルのクエリは選択属性によって構成されます。

21. MyBatis で 1 対多を実装するにはいくつかの方法がありますが、どのように操作すればよいですか?

ユニオンクエリとネストクエリがあります。結合クエリは、複数のテーブルの結合クエリであり、

resultMap のコレクション ノードは 1 対多のクラスで構成でき、ネストされたクエリが最初にチェックされます。

このテーブルの結果の外部キー ID に従って、別のテーブルのデータをクエリするためのテーブル。

コレクションを構成しますが、別のテーブルのクエリは選択ノードを通じて構成されます。

22. 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().geName( ) メソッド呼び出し。

これが遅延読み込みの基本原則です。

もちろん、Mybatis だけでなく、Hibernate を含むほぼすべてのものが遅延読み込みの原則をサポートしています。

それは同じだ。

23. Mybatis の第 1 レベルと第 2 レベルのキャッシュ:

1) レベル 1 キャッシュ: PerpetualCache に基づく HashMap ローカル キャッシュ、そのストレージ スコープは

セッション。セッションがフラッシュまたはクローズされると、セッション内のすべてのキャッシュが消去されます。

クリアされ、一次キャッシュはデフォルトでオンになります。

2) 2 次キャッシュは 1 次キャッシュと同じメカニズムを持ち、デフォルトでは PerpetualCache、HashMap が使用されます。

ストレージの違いは、ストレージスコープがマッパー(名前空間)であり、ストレージソースがカスタマイズできることです。

Ehcache など。デフォルトでは、2次キャッシュは有効になっていないため、2次キャッシュを有効にする必要があります。

第 2 レベルのキャッシュ属性クラスを使用するには、マッピング ファイルで構成できる Serializable シリアル化インターフェイス (オブジェクトの状態を保存するために使用できます) を実装する必要があります。

キャッシュデータの更新機構については、一定の範囲(一次キャッシュセッション/二次キャッシュ)の場合、

名前空間) C/U/D 操作の実行後、デフォルトでは、このスコープ内の選択内のすべてのキャッシュが

クリアされてください。

24. MyBatis のインターフェイス バインディングとは何ですか? どのような実装がありますか?

インターフェースバインディングとは、MyBatis内で任意にインターフェースを定義し、そのインターフェース内のメソッドをSQL文にバインドすることです。

インターフェイス メソッドを直接呼び出すことができることが判明したため、SqlSession によって提供される元のメソッドと比較して、

より柔軟なオプションと設定を使用するには。

インターフェイス バインディングを実装するには 2 つの方法があります。

1 つはアノテーション バインディングを介して、インターフェイスのメソッドを追加することです。

@Select、@Update、およびその他のアノテーション。バインドする SQL ステートメントが含まれます。

もう1つはxmlにSQLを書いてバインドする方法です。

この場合、XML マッピング ファイルで名前空間を指定するには、インターフェイスのフル パス名を指定する必要があります。

SQL ステートメントが比較的単純な場合は、アノテーション バインディングを使用します。SQL ステートメントがより複雑な場合は、xml バインディングを使用します。一般的には、xml バインディングの使用が多くなります。

25. MyBatis のマッパー インターフェイスを使用する場合の要件は何ですか?

1. Mapper インターフェイスのメソッド名は、mapper.xml で定義された各 SQL の ID と同じです。

2. Mapperインターフェースメソッドの入力パラメータの型とmapper.xmlに定義されている各SQL

パラメータタイプは同じタイプです。

3. Mapperインターフェースメソッドの出力パラメータの型とmapper.xmlに定義されている各SQL

resultType の型は同じです。

4. Mapper.xml ファイル内の名前空間は、マッパー インターフェイスのクラス パスです。

26. Mapperの書き方にはどのようなものがありますか?

最初のタイプ: インターフェイス実装クラスは SqlSessionDaoSupport を継承します

このメソッドを使用するには、マッパー インターフェイス、マッパー インターフェイス実装クラス、および mapper.xml ファイルを作成する必要があります。

1.sqlMapConfig.xmlでmapper.xmlの場所を構成します。

<mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /> </mappers> 

1. マッパーインターフェイスを定義します。

2. クラス統合 SqlSessionDaoSupport を実装します。

マッパーメソッドでは、 this.getSqlSession() を使用してデータの追加、削除、変更、確認を行うことができます。

3. スプリングの構成。

<bean id=" " class="mapper 接口的实现"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> 

2 番目: org.mybatis.spring.mapper.MapperFactoryBean を使用します。

1. sqlMapConfig.xml で Mapper.xml の場所を構成します。

mapper.xml と mappre インターフェースが同じ名前で同じディレクトリにある場合、 を設定する必要はありません。

<mappers> <mapper resource="mapper.xml 文件的地址" /> <mapper resource="mapper.xml 文件的地址" /> </mappers> 

2. マッパーインターフェイスを定義します。

1. mapper.xml の名前空間は、マッパー インターフェイスのアドレスです。

2. マッパーインターフェイスのメソッド名は、mapper.xml で定義されたステートメントの ID と同じです。

に。

3. 春に定義

<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="mapper 接口地址" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> 

3 番目の方法: マッパー スキャナーを使用します。

1. Mapper.xml ファイルの書き込み:

mapper.xml の名前空間はマッパー インターフェイスのアドレスです。

マッパー インターフェイスのメソッド名は、mapper.xml で定義されたステートメントの ID と一致します。

mapper.xml とマッパー インターフェイスの名前を一貫させておく場合は、sqlMapConfig.xml でそれを使用する必要はありません。

で設定します。

2. マッパーインターフェイスを定義します。

mapper.xml のファイル名はマッパーのインターフェイス名と一致しており、同じディレクトリに配置されることに注意してください。

3. マッパー スキャナーを構成します。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="mapper 接口包地址 "></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean>

4. スキャナーを使用した後、Spring コンテナーからマッパー実装オブジェクトを取得します。

27. Mybatisプラグインの動作原理とプラグインの書き方を簡単に説明します。

回答: Mybatis は ParameterHandler、ResultSetHandler、

StatementHandler、Executor、これら 4 つのインターフェイス プラグイン、Mybatis は JDK の動的生成を使用します

インターフェイス メソッド インターセプト機能を実装するためにインターセプトする必要があるインターフェイスのプロキシ オブジェクトを生成します。

これら 4 つのインターフェイス オブジェクトのメソッドが実行されるたびに、インターセプト メソッド、具体的には InvocationHandler に入ります。

もちろん、invoke() メソッドは、インターセプトするように指定されたメソッドのみをインターセプトします。

プラグインを作成します。

Mybatis の Interceptor インターフェイスを実装し、intercept() メソッドをオーバーライドしてから、プラグインのアノテーションを記述します。

どのインターフェイスのどのメソッドをインターセプトするかを指定するだけです。忘れずに、設定ファイルに記述したプラグインを設定することを忘れないでください。

出典:公式アカウント「Programmer Mason」ブログ:https://bysocket.com/

内容は、Java バックエンド技術、Spring Boot、Spring Cloud、マイクロサービス アーキテクチャ、運用保守開発、システム監視などに関する調査と知識共有をカバーします。

おすすめ

転載: blog.csdn.net/u010378410/article/details/130101049