技術共有

【MyBatis】MyBatis理論40問(2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

MyBatis理論40の質問》以下の2記事が収録されています。


MyBatis理論40問(2)

21. 生成された主キーを取得するにはどうすればよいですか?

新しいタグを追加します。keyProperty=“ID” それでおしまい。

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

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

(1) 問い合わせによる 構文 フィールド名の別名がエンティティ クラスの属性名と一致するように、ステートメント内でフィールド名の別名を定義します。

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2)パス <resultMap> フィールド名とエンティティ クラスの属性名を 1 対 1 に対応付ける。

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

(1) インタフェース実装クラスの継承 SqlSessionDaoSupport: このメソッドを使用するには、次のように記述する必要があります mapper インターフェース、mapper インターフェース実装クラス、mapper.xml 書類。

  • 存在する sqlMapConfig.xml 中程度の構成mapper.xml の位置。
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • 意味 mapper インターフェース。
  • クラス統合を実装する SqlSessionDaoSupportmapper メソッド内で使用可能this.getSqlSession() データの追加、削除、変更、確認を行います。
  • spring 構成。
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) 用途 org.mybatis.spring.mapper.MapperFactoryBean

  • 存在する sqlMapConfig.xml 中程度の構成mapper.xml 場合の位置mapper.xml そしてmapper インターフェイスは同じ名前を持ち、同じディレクトリにあるため、ここでの設定は必要ありません。
  • 意味 mapper インターフェース。
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml 真ん中namespace のためにmapper インターフェースのアドレス。
  • mapper インターフェース内のメソッド名とmapper.xml で定義されていますstatementid 一貫性を保つこと。
  • Spring で定義されています。
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) 用途 mapper スキャナー。

  • mapper.xml 文書作成。
    • mapper.xml 真ん中namespace のためにmapper インターフェースのアドレス。
    • mapper インターフェース内のメソッド名とmapper.xml で定義されていますstatementid 一貫性があること。
    • もし mapper.xml そしてmapper インターフェイスの名前が一貫している場合は、次のようにする必要はありません。sqlMapConfig.xml で設定します。
  • 意味 mapper インターフェース。知らせmapper.xml ファイル名とmapper インターフェイス名は一貫しており、同じディレクトリに配置する必要があります。
  • 構成 mapper スキャナー。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • からスキャナーを使用した後、 spring コンテナから取得mapper 実装オブジェクト。

24. とは マイバティス インターフェースバインディング?実装方法にはどのようなものがありますか?

インターフェースバインディングとは、MyBatis上で任意にインターフェースを定義し、そのインターフェース内のメソッドをSQLで結合することです。 声明バインディングでは、インターフェイスのメソッドを直接呼び出すことができるので、オリジナルと比較して SqlSession 提供されているメソッドにより、より柔軟な選択と設定が可能になります。

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

  • アノテーションによるバインディングは追加することです @Select@Update バインドする SQL ステートメントを含むアノテーションを待ちます。
  • 合格 xml この場合、バインドするために内部に SQL を記述する必要があります。xml マッピングファイル内でnamespace インターフェイスの完全なパス名である必要があります。SQL ステートメントが比較的単純な場合は、アノテーション バインディングを使用します。 SQL ステートメントが比較的複雑な場合は、アノテーション バインディングを使用します。xml バインディング、一般用途xml さらに多くのバインディングがあります。

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

  • マッパーインターフェイスのメソッド名と mapper.xml で定義された各 SQL のid 同じ。
  • Mapper インターフェイス メソッドの入力パラメータの型と mapper.xml で定義された各 SQL のparameterType 同じタイプの。
  • Mapper インターフェイス メソッドの出力パラメータの型と mapper.xml で定義された各 SQL のresultType 同じタイプの。
  • Mapper.xml ファイルの中にnamespace それが Mapper インターフェースのクラスパスです。

26. この Dao インターフェースはどのように機能しますか? Dao インターフェースのメソッドに異なるパラメーターがある場合、メソッドをオーバーロードできますか?

  • Dao インターフェースの動作原理は JDK 動的プロキシです。MyBatis は実行時に JDK 動的プロキシを使用して Dao インターフェースのプロキシを生成します。 proxy オブジェクト、プロキシ オブジェクトproxy インターフェースメソッドはインターセプトされ、代わりに実行されますMappedStatement SQLを表し、SQLの実行結果を返します。
  • Dao インターフェースのメソッドはオーバーロードできません。 完全修飾名 + メソッド名 戦略の保存と検索。

27. MyBatis の XML マッピング ファイルでは、ID を別の Xml マッピング ファイルで繰り返すことができますか?

  • 異なる XML マッピング ファイル (構成されている場合) namespace、それで id 設定されていない場合は繰り返すことができます。namespace、それで id 結局のところ、繰り返すことはできません。namespace 必須ではありません。ベストプラクティスのみです。
  • その理由は namespace + id のようなものです マップ &lt; 文字列、マップされたステートメント &gt; マップ<String, MappedStatement>1つのp<r,1つの1ページed1つのteメートルet> 使用するキー (存在しない場合)namespace、残りのみ id、それで、id 重複するとデータが互いに上書きされる可能性があります。わかったnamespace、自然 id 繰り返してもいいのですが、namespace 違う、namespace + id 当然違います。

28. MyBatis の XML マッピング ファイルと MyBatis の内部データ構造の間のマッピング関係を簡単に説明してください。

MyBatis は、すべての XML 構成情報をオールインワンの重量オブジェクトにカプセル化します。 Configuration 内部。 XML マッピング ファイルでは、<parameterMap> タグは次のように解析されます。ParameterMap オブジェクトの場合、その子要素はそれぞれ次のように解析されます。ParameterMapping 物体。<resultMap> タグは次のように解析されます。ResultMap オブジェクトの場合、その子要素はそれぞれ次のように解析されます。ResultMapping 物体。毎<select><insert><update><delete> タグは次のように解析されますMappedStatement オブジェクトの場合、タグ内の SQL は次のように解析されます。BoundSql 物体。

29.MyBatis は SQL の実行結果をどのようにターゲット オブジェクトにカプセル化して返しますか?マッピング形式とは何ですか?

  • 1つ目は、使用することです <resultMap> タグは、列名とオブジェクト属性名のマッピング関係を 1 つずつ定義します。
  • 2 つ目は、SQL 列エイリアス関数を使用し、オブジェクト属性名として列エイリアスを書き込む方法です。たとえば、 T_NAME AS NAME、オブジェクトの属性名は通常、 name、小文字ですが、列名は大文字と小文字を区別しません。MyBatis は列名の大文字と小文字を無視して、対応するオブジェクト属性名をインテリジェントに検索します。 T_NAME AS NaMe, MyBatis は引き続き正常に動作します。

MyBatis は、列名と属性名のマッピング関係を取得した後、リフレクションを使用してオブジェクトを作成し、マッピング関係が見つからないプロパティについては、リフレクションを使用してオブジェクトのプロパティに値を 1 つずつ割り当てて返します。 、割り当てを完了できません。

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

他にもたくさんのタグがありますが、 <resultMap><parameterMap><sql><include><selectKey>、動的 SQL を加えたもの 9 9 9 タグ:trimwheresetforeachifchoosewhenotherwisebind 待って。で<sql> SQL フラグメント タグの場合は、次のように渡します。<include> タグは SQL フラグメントを導入します。<selectKey> 自動インクリメントをサポートしない主キーのポリシー ラベルを生成します。

31. MyBatis マッピング ファイルで、A タグが include を通じて B タグのコンテンツを参照する場合、B タグは A タグの後に定義できますか、それとも A タグの前に定義する必要がありますか?

MyBatis は XML マッピング ファイルを順番に解析しますが、参照される B タグはどこにでも定義でき、MyBatis はそれを正しく識別できます。

原則として、MyBatis は A タグを解析し、A タグが B タグを参照していることを検出しますが、B タグは解析されておらず、まだ存在していません。この時点では、MyBatis は A タグを未解決としてマークし、続行します。 B タグを含む残りのタグを解析するため、すべてのタグが解析された後、MyBatis は、A タグを解析するときに、B タグがすでに存在しており、A タグを正常に解析できます。

32. MyBatis は 1 対多および 1 対 1 の連絡先クエリを実行できますか? 実装方法は何ですか?

できる、できるだけではない 1対多、1対1,まあ十分です 多対多、多対一 。これは次のようにして実現されます。

  • 別の SQL を送信して関連オブジェクトをクエリし、それをメイン オブジェクトに割り当ててから、メイン オブジェクトを返します。
  • JOIN クエリと同様に、ネストされたクエリを使用すると、一方の部分はオブジェクト A の属性値になり、もう一方の部分は関連オブジェクト B の属性値になります。利点は、1 つの属性値が送信される限り、メイン オブジェクトと関連するオブジェクトが見つかります。
  • サブクエリ

33.MyBatis は Enum 列挙型クラスをマップできますか?

MyBatis は列挙型クラスをマップできるだけでなく、任意のオブジェクトをテーブルの列にマップできます。マッピング方法はカスタマイズされたものですTypeHandler、成し遂げる TypeHandlersetParameter() そしてgetResult() インターフェースメソッド。

TypeHandler これには 2 つの機能があります。1 つは、javaTypejdbcType 変換、2回目が完了しましたjdbcTypejavaType 変換は次のように反映されますsetParameter() そしてgetResult() 2 つのメソッドは、それぞれ SQL 疑問符プレースホルダー パラメーターの設定と列クエリ結果の取得を表します。

34.MyBatis 動的 SQL は何をしますか?動的SQLにはどのような種類があるのでしょうか?動的SQLの実行原理を簡単に説明してもらえますか?

MyBatis 動的 SQL を使用すると、Xml マッピング ファイル内のタグの形式で動的 SQL を記述し、MyBatis が提供する SQL の論理判断と動的スプライシングの機能を完了できます。 9 9 9 動的 SQL タグ:trimwheresetforeachifchoosewhenotherwisebind

その実行原理は次のとおりです。 OGNL SQL パラメータ オブジェクトから式の値を計算し、式の値に従って SQL を動的に結合して、動的 SQL の機能を完成します。

35.MyBatis はどのようにページングを実行しますか?ページングプラグインの原理は何ですか?

MyBatis が使用する RowBounds オブジェクトはページ分割されています。ResultSet 結果セットによって実行されるメモリ ページングは​​物理ページングではありません。SQL で物理ページングを含むパラメーターを直接記述して物理ページング機能を完了することも、ページング プラグインを使用して物理ページングを完了することもできます。

ページング プラグインの基本原理は、MyBatis が提供するプラグイン インターフェイスを使用してカスタム プラグインを実装し、プラグインのインターセプト メソッドで実行される SQL をインターセプトし、それに応じて SQL を書き換えることです。に dialect 方言、対応する物理ページング ステートメントと物理ページング パラメーターを追加します。

例:

select * from student
  • 1

SQL をインターセプトした後、次のように書き換えます。

select t.* from (select * from student) t limit 0, 10
  • 1

36. MyBatisプラグインの動作原理とプラグインの書き方を簡単に説明してください。

MyBatis は以下に対してのみ書き込むことができます ParameterHandlerResultSetHandlerStatementHandlerExecutor これ 4 4 4 MyBatis はインターフェイス プラグインの一種で、これが実行されるたびに、JDK の動的プロキシを使用して、インターフェイス メソッドのインターセプト機能を実装するためにインターセプトする必要があるインターフェイスのプロキシ オブジェクトを生成します。 4 4 4 インターフェイス オブジェクトのメソッドを使用すると、インターセプト メソッドに入ります。具体的には、InvocationHandlerinvoke() もちろん、メソッドはインターセプトするように指定したメソッドのみをインターセプトします。

MyBatisの実装 Interceptor インターフェースとオーバーライドintercept() 次に、プラグインのアノテーションを記述し、どのインターフェースのどのメソッドをインターセプトするかを指定します。構成ファイルに記述したプラグインを忘れずに構成してください。

37. MyBatis の 1 次キャッシュと 2 次キャッシュ

  • レベル 1 キャッシュ: に基づく PerpetualCache HashMap ローカル キャッシュ、そのストレージ スコープはセッション、セッションの場合flush またはclose その後、セッション内のすべてのキャッシュがクリアされ、1 次キャッシュがデフォルトでオンになります。
  • 2 次キャッシュには 1 次キャッシュと同じメカニズムがあり、これもデフォルトで使用されます。 PerpetualCache、HashMap ストレージの違いは、ストレージのスコープが MapperNamespace)、ストレージ ソースは次のようにカスタマイズできます。 Ehcache 。2 次キャッシュはデフォルトでは有効になっていません。2 次キャッシュを有効にするには、2 次キャッシュ属性クラスを実装する必要があります。Serializable シリアル化インターフェイス (オブジェクトの状態を保存するために使用可能)、マッピング ファイルで構成可能<cache/>
  • キャッシュデータの更新機構については、特定のスコープ(一次キャッシュセッション/二次キャッシュNamespace)が指定されている場合に、 C / U / D 操作後、デフォルトではこのスコープ内のすべてのファイルがselect キャッシュは次のようになりますclear