MyBatisとは何ですか?
MyBatisは、カスタムSQL、ストアドプロシージャ、高度なマッピングをサポートする優れた永続層フレームワークです。JDBCコードの大部分やパラメータ設定、結果セットの取得といった手動処理を大幅に削減します。
MyBatisの利点
- 柔軟性: SQL文を直接記述できるため、非常に柔軟な操作が可能です。
- 習得の容易さ: Hibernateのようなフル機能ORMフレームワークと比較して、学習コストが低いです。
- 高性能: SQLを直接実行するため、パフォーマンスが優れています。
- データベース非依存性: あらゆるデータベースと連携できます。
- 動的SQL: XMLまたはアノテーションを用いて動的SQLを構築できます。
MyBatisフレームワークの欠点
- コード量の増加: SQL文を手動で記述する必要があるため、コード量が増加します。
- SQLのメンテナンスコスト: SQL文がコード内に埋め込まれるため、保守が困難になる場合があります。
- データベースの移植性: SQLを直接使用するため、データベース間のSQL構文の差異により移植が難しい場合があります。
MyBatisフレームワークの適用シナリオ
- SQLの厳密な制御が必要なプロジェクト: SQLの実行を精密に制御する必要がある場合。
- 複雑なクエリ操作: 複雑なSQLクエリやストアドプロシージャを必要とするシナリオ。
- 高いパフォーマンスが求められるプロジェクト: 高パフォーマンスなデータベース操作を必要とする場合。
MyBatisとHibernateの違い
- SQL制御: MyBatisは手動でSQLを記述する必要がありますが、Hibernateは自動的にSQLを生成します。
- キャッシュ機構: Hibernateはより豊富なキャッシュ機構を提供しますが、MyBatisは主に手動で制御します。
- 学習曲線: Hibernateの学習曲線はMyBatisよりも急です。
- 適用シナリオ: データベース構造の変更が頻繁なプロジェクトにはHibernateが、SQLが複雑で変化が少ないプロジェクトにはMyBatisが適しています。
#と$の違い
- #{}: プリコンパイルされたステートメントのプレースホルダーとして機能し、SQLインジェクションを防ぎます。
- ${}: 文字列を直接連結するため、SQLインジェクションのリスクがあります。
エンティティクラスのプロパティ名とテーブルのカラム名が異なる場合の対処法
MyBatisの<resultMap>要素を使用して、エンティティのプロパティとテーブルのカラムをマッピングします。
LIKE句によるあいまい検索の書き方
#{}とSQLのワイルドカードLIKEを組み合わせて使用します。例えば、以下のように記述します。
SELECT * FROM products WHERE description LIKE CONCAT('%', #{keyword}, '%')
通常、Xmlマッピングファイルには対応するDaoインターフェースが記述されます。このDaoインターフェースの動作原理は何ですか?
DAOインターフェースは、MyBatisの動的プロキシ機構によって機能します。MyBatisは実行時にインターフェースに対するプロキシクラスを生成します。インターフェースのメソッドが呼び出されると、メソッドシグネチャに基づいて対応するXMLマッピングファイル内のSQLステートメントを実行します。
MyBatisはどのようにページングを実装しますか?ページネーションプラグインの原理は何ですか?
MyBatisは通常、PageHelperのようなページネーションプラグインを使用してページングを実装します。ページネーションプラグインは実行されるSQLステートメントをインターセプトし、SQLステートメントの末尾にLIMIT句を追加することで、特定の範囲の結果を返します。
MyBatisはどのようにSQLの実行結果をターゲットオブジェクトにカプセル化し、返却しますか?どのようなマッピング形式がありますか?
MyBatisはresultMapや@Resultsアノテーションを用いて、SQLの実行結果をオブジェクトにマッピングして返却します。主なマッピング形式は以下の2つです。
- 自動マッピング: MyBatisがカラム名とプロパティ名を自動的にマッチングします。
- 手動マッピング:
resultMapや@Resultsアノテーションを用いてマッピング関係を手動で指定します。
どのようにバッチ挿入を実行しますか?
MyBatisのforeach要素を使用します。
<insert id="batchInsert">
INSERT INTO products (product_name, price) VALUES
<foreach collection="items" item="item" separator=",">
(#{item.name}, #{item.cost})
</foreach>
</insert>
自動生成された(主)キーの値をどのように取得しますか?
useGeneratedKeysとkeyProperty属性を使用します。
<insert id="createOrder" useGeneratedKeys="true" keyProperty="orderId">
INSERT INTO orders (order_amount) VALUES (#{amount})
</insert>
mapperで複数のパラメータをどのように渡しますか?
@Paramアノテーションを使用します。
@Mapper
public interface UserRepository {
@Select("SELECT * FROM users WHERE username = #{name} AND email = #{mail}")
List<User> findByCredentials(@Param("name") String username, @Param("mail") String email);
}
MyBatisの動的SQLにはどのような用途がありますか?実行原理は何ですか?どのような動的SQLがありますか?
動的SQLは、条件に応じて異なるSQLステートメントを生成するために使用されます。MyBatisはif、choose、trim、foreachなどのタグを用いて動的SQLを実現します。実行原理は、渡されたパラメータに基づいて実行時に具体的なSQLステートメントを生成するというものです。
XMLマッピングファイルには、一般的なselect、insert、update、deleteタグの他に、どのようなタグがありますか?
他にも<resultMap>、<sql>、<include>、<foreach>、<if>、<choose>などのタグが存在します。
なぜMyBatisは半自動ORMマッピングツールと呼ばれるのですか?全自动との違いはどこにありますか?
MyBatisはSQL文を手動で記述する必要があるため、半自動ORMマッピングツールと呼ばれます。一方、HibernateのようなフルオートマティックORMはSQL文を自動生成するため、手動記述は不要です。
MyBatisで1対1の関連をどのように実装しますか?具体的な操作方法は?
主に2つの方法があります。
- resultMapを使用する: resultMap内で
association要素を利用します。 - ネストされたクエリを使用する: SELECTステートメント内でネストされたクエリを利用します。
MyBatisで1対多の関連をどのように実装しますか?具体的な操作方法は?
主に2つの方法があります。
- resultMapを使用する: resultMap内で
collection要素を利用します。 - ネストされたクエリを使用する: SELECTステートメント内でネストされたクエリを利用します。
MyBatisは遅延ロードをサポートしていますか?もしサポートしている場合、その実装原理は何ですか?
MyBatisは遅延ロードをサポートしています。その実装原理は、プロキシオブジェクトを介して遅延ロードされたプロパティに初めてアクセスした際にSQLクエリを発行するというものです。
MyBatisの第一レベルキャッシュと第二レベルキャッシュ
- 第一レベルキャッシュ: セッションレベルのキャッシュで、デフォルトで有効です。同一のSqlSession内でのみ有効です。
- 第二レベルキャッシュ: マッピングレベルのキャッシュで、明示的に設定が必要です。同一のマッピングファイル内でのみ有効です。
MyBatisのインターフェースバインディングとは何ですか?どのような実装方法がありますか?
インターフェースバインディングとは、SQLステートメントをインターフェースのメソッドに紐付けることです。実装方法には、アノテーション方式とXML設定方式があります。
MyBatisのmapperインターフェースを呼び出す際にどのような要件がありますか?
インターフェースのメソッド名はXML設定ファイル内のSQLステートメントのIDと一致する必要があり、メソッドのパラメータと戻り値の型はSQLステートメントと一致する必要があります。
Mapperの記述方法にはどのようなものがありますか?
- XMLマッピングファイル: XMLファイルを使用してSQLステートメントを記述します。
- アノテーション方式: インターフェースのメソッドにアノテーションを付与してSQLステートメントを記述します。
MyBatisのプラグインの動作原理を簡単に説明し、どのようにプラグインを記述しますか?
MyBatisのプラグインは、インターセプターメカニズムを通じてSQL実行プロセスの特定のポイントをインターセプトします。プラグインを記述するには、Interceptorインターフェースを実装し、MyBatisの設定ファイルでプラグインを登録する必要があります。