ゴールデンナインシルバーテンスプリント-MyBatisインタビュートピック(回答を含む)

フロントに書かれている:2020年のインタビューに必要なJavaバックエンドの高度なインタビューの質問。レビューガイドはGithubに要約されています。内容は写真とテキストで詳細に説明されています。学ぶ必要がある友達は主演できます!
GitHubアドレス:https//github.com/abel-max/Java-Study-Note/tree/master

1. Mybatisとは何ですか?

(1)Mybatisはsemi-ORM(Object Relational Mapping)フレームワークであり、JDBCを内部的にカプセル化します。開発中にSQLステートメント自体に注意を払うだけでよく、ドライバーのロード、接続の作成、ステートメントの作成などの複雑なプロセスを処理するためにエネルギーを費やす必要はありません。プログラマーは、オリジナルのエコロジカルSQLを直接記述します。これにより、SQLの実行パフォーマンスを高い柔軟性で厳密に制御できます。
(2)MyBatisは、XMLまたは注釈を使用して、ネイティブ情報を構成およびマップし、POJOをデータベース内のレコードにマップして、ほとんどすべてのJDBCコードとパラメーターの手動設定を回避し、結果セットを取得できます。
(3)xmlファイルまたは注釈を使用して実行されるさまざまなステートメントを構成し、ステートメント内のjavaオブジェクトとsqlの動的パラメーターをマッピングすることにより、最終的に実行されるSQLステートメントを生成します。最後に、mybatisフレームワークはsqlを実行し、結果を次のようにマッピングします。 javaオブジェクトとreturn。(sqlの実行から結果を返すまでのプロセス)。

2.Mybaitsの利点

(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ステートメントを書き込むための特定の要件があります。
(2)SQLステートメントはデータベースに依存しているため、データベースの移植性が低く、データベースを自由に置き換えることはできません。

4.MyBatisフレームワークの該当する機会

(1)MyBatisはSQL自体に焦点を当てており、十分に柔軟なDAOレイヤーソリューションです。
(2)インターネットプロジェクトなど、高いパフォーマンス要件や需要の変化があるプロジェクトには、MyBatisが適しています。

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

(1)Mybatisは休止状態とは異なり、MyBatisではプログラマーがSqlステートメントを作成する必要があるため、正確にはORMフレームワークではありません。
(2)Mybatisは、SQLの実行パフォーマンスを厳密に制御でき、柔軟性の高いオリジナルのエコロジカルSQLを直接書き込みます。このタイプのソフトウェアの要件は頻繁に変更され、要件の変更後に迅速な出力が必要になるため、リレーショナルデータモデルの高い要件を必要としないソフトウェア開発に非常に適しています。 。ただし、柔軟性の前提は、mybatisをデータベースに依存させないことです。複数のデータベースをサポートするソフトウェアを実装する必要がある場合は、複数のsqlマッピングファイルのセットをカスタマイズする必要があり、これは大変な作業です。
(3)Hibernateは、強力なオブジェクト/リレーショナルマッピング機能と優れたデータベース独立性を備えています。リレーショナルモデルの要件が高いソフトウェアの場合、hibernateを使用してソフトウェアを開発すると、多くのコードを節約し、効率を向上させることができます。

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

{}はコンパイル前の処理、$ {}は文字列の置換です

Mybatisが#{}を処理しているときは、sqlの#{}を?
記号に置き換え、PreparedStatementのsetメソッドを呼び出して値を割り当てます。Mybatisが処理しているとき、{}になります。ときそれはある{}変数の値を置き換えます。
#{}を使用すると、SQLの挿入を効果的に防ぎ、システムのセキュリティを向上させることができます。

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

タイプ1:query 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.ファジークエリでlikeステートメントを書く方法は?

タイプ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インターフェイスの動作原理はJDK動的プロキシです。Mybatisは実行時にJDK動的プロキシを使用してMapperインターフェイスのプロキシオブジェクトプロキシを生成します。プロキシオブジェクトはインターフェイスメソッドをインターセプトし、代わりにMapperStatementで表されるsqlを実行して、sql実行結果を返します。

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

Mybatisは、ページングにRowBoundsオブジェクトを使用します。これは、物理的なページングではなく、ResultSet結果セットのメモリページングです。物理ページングを使用してパラメーターをsqlに直接記述して物理ページング機能を完了するか、ページングプラグインを使用して物理ページングを完了することができます。
ページングプラグインの基本原則は、Mybatisが提供するプラグインインターフェイスを使用してカスタムプラグインを実装し、プラグインのインターセプトメソッドで実行されるSQLをインターセプトしてから、方言の方言に従ってSQLを書き換え、対応する物理ページングステートメントと物理ページングパラメーターを追加することです。

11. Mybatisはどのようにしてsql実行結果をターゲットオブジェクトとしてカプセル化し、それを返しますか?マッピングフォームとは何ですか?

1つは、タグを使用して、データベースの列名とオブジェクトの属性名の間のマッピング関係を1つずつ定義することです。
2つ目は、sql列のエイリアス関数を使用して、列のエイリアスをオブジェクト属性名として書き込むことです。
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番目のタイプ:複数のパラメーターがマップにカプセル化されます

try {
//映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的
SQL
//由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此
我们使用 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 dynamic sqlは、Xmlマッピングファイルにタグの形式で動的sqlを書き込むことができます。実行原理は、式の値に基づいて論理的な判断を完了し、sql関数を動的にスプライスすることです。
Mybatisは、9種類の動的sqlタグを提供します。trim| where | set | foreach | if | choice
| when | else | bind。

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

回答:、、、、、および動的sqlの9つのタグが追加され、その中にsqlフラグメントタグがあります。SQLフラグメントはタグを介して導入され、自動インクリメントをサポートしないプライマリキーの戦略タグを生成します。

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

異なるXmlマッピングファイルの場合、名前付けが構成されている場合はIDを繰り返すことができます。名前付けが構成されていない場合は、IDを繰り返すことはできません。
理由は、namespace + idがMap <String、MapperStatement>のキーとして使用されるためです名前付け
がない場合は、何も残りません。 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は、別のテーブルのデータをクエリするために使用されます。このテーブルも関連付けによって構成されますが、別のテーブルのクエリはselect属性によって構成されます。

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( ).getName()メソッド呼び出し。これがレイジーローディングの基本原理です。
もちろん、Mybatisだけでなく、Hibernateを含むほとんどすべてが、同じ原理でレイジーローディングをサポートしています。

23、Mybatisのプライマリおよびセカンダリキャッシュ

1)レベル1キャッシュ:PerpetualCacheに基づくHashMapローカルキャッシュ。そのストレージスコープはSessionです。セッションのフラッシュまたはクローズ後、セッション内のすべてのキャッシュが空になり、レベル1キャッシュがデフォルトでオンになります。
2)第2レベルのキャッシュのメカニズムは、第1レベルのキャッシュのメカニズムと同じです。デフォルトでは、PerpetualCacheとHashMapがストレージに使用されます。違いは、ストレージスコープがMapper(Namespace)であり、ストレージソースをEhcacheなどでカスタマイズできることです。第2レベルのキャッシュは、デフォルトではオンになっていません。第2レベルのキャッシュを有効にするには、第2レベルのキャッシュ属性クラスを使用して、マッピングファイルで構成できるSerializableシリアル化インターフェイス(オブジェクトの状態を保存するために使用できます)を実装する必要があります
。3)キャッシュデータ更新メカニズムの場合、
C / U / D操作が特定のスコープ(第1レベルのキャッシュセッション/第2レベルのキャッシュネームスペース)で実行されると、このスコープで選択されているすべてのキャッシュがデフォルトでクリアされます。

24. MyBatisのインターフェースバインディングとは何ですか?それを達成する方法は何ですか?

インターフェイスバインディングでは、MyBatisでインターフェイスを任意に定義してから、インターフェイスのメソッドをSQLステートメントにバインドします。インターフェイスメソッドを直接呼び出すことができるため、SqlSessionによって提供される元のメソッドよりも柔軟な選択と設定を行うことができます。 。
インターフェイスバインディングを実装するには、2つの方法があります。1つは、アノテーションを介してバインドする方法です。1つは、@ Select、@ Update、およびその他のアノテーションを、バインドするSqlステートメントを含むインターフェイスメソッドに追加することです。もう1つは、SQLをxmlで記述することです。この場合、バインドするには、xmlマッピングファイルの名前名がインターフェイスのフルパス名である必要があります。Sqlステートメントが比較的単純な場合は注釈バインディングを使用し、SQLステートメントがより複雑な場合はxmlバインディングを使用し、通常はxmlバインディングをさらに使用します。

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

1.マッパーインターフェイスメソッド名は、mapper.xmlで定義されている各SQLのIDと同じです
。2。マッパーインターフェイスメソッドの入力パラメータータイプは、mapper.xmlで定義されている各SQLの
parameterTypeと同じです。3
マッパーインターフェイスメソッドのタイプ出力パラメータタイプ
は、mapper.xmlで定義されている各SQLのresultTypeと同じです
。4。Mapper.xmlファイルの名前名は、マッパーインターフェイスのクラスパスです。

26.マッパーを書く方法は何ですか?

1つ目:インターフェイス実装クラスはSqlSessionDaoSupportを継承します。このメソッドを使用するには、
マッパーインターフェイス、マッパーインターフェイス実装クラス、およびmapper.xmlファイルを作成する必要があります。
(1)sqlMapConfig.xmlでmapper.xmlの場所を構成します

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

(2)マッパーインターフェイスを定義します。
(3)クラス統合SqlSessionDaoSupport
マッパーメソッドの実装では、this.getSqlSession()を使用して、データを追加、削除、変更、およびチェックできます。
(4)スプリング構成

<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における名前空間はアドレス
マッパーインタフェースのメソッド名がmapper.xml 3の定義で定義されたステートメントのIDと一致している2インターフェイスマッパーの

<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と一致しています; if 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)スキャナーを使用した後、スプリングコンテナーからマッパー実装オブジェクトを取得します。

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

回答:Mybatisは
ParameterHandler、ResultSetHandler、StatementHandler、およびExecutorの4つのインターフェイスのプラグインのみを書き込むことができます。Mybatisは、JDKの動的プロキシを使用して、インターフェイスメソッドインターセプト機能を実装するためにインターセプトする必要があるインターフェイスのプロキシオブジェクトを生成します。これらの4つのインターフェイスが実行されるたびにオブジェクトのメソッドがインターセプトメソッド、具体的にはInvocationHandlerのinvoke()メソッドに入ると、もちろん、インターセプトするように指定したメソッドのみがインターセプトされます。
プラグインの作成:MybatisのInterceptorインターフェイスを実装し、intercept()メソッドをオーバーライドしてから、プラグインの注釈を作成して、インターセプトするインターフェイスのメソッドを指定します。構成ファイルに書き込んだプラグインを構成することを忘れないでください。

おすすめ

転載: blog.csdn.net/doubututou/article/details/109128923