MyBatisとMyBatis-Plusのソースコードを読む――SqlSessionからプラグインチェーンまで
ベースライン:MyBatis 3.5.x、MyBatis-Plus 3.5.x、Spring Boot 3、Java 17+。
1. 標準実行チェーン
TEXT
Mapper proxy -> SqlSession -> Executor -> StatementHandler -> JDBC -> ResultSetHandler
SqlSessionが入口です。Executorはクエリ、更新、トランザクション、1次キャッシュを担当します。StatementHandlerはパラメータとStatementの処理を担当し、ResultSetHandlerは結果マッピングを担当します。MyBatis-PlusはBaseMapper、Wrapper、自動入力、論理削除、ページング、インタセプタを追加しますが、JDBCのトランザクション制約は変わりません。
2. パラメータバインディング
XML
<select id="findByStatus" resultType="Order">
select * from orders where status = #{status}
</select>
文字列の置換は、ホワイトリストで管理したテーブル名、カラム名、ソートフィールドにだけ使ってください。ユーザー入力をSQLへ直接連結してはいけません。
3. Executorとキャッシュ
SimpleExecutorは毎回Statementを生成します。ReuseExecutorはStatementを再利用し、BatchExecutorは更新をまとめて送信し、CachingExecutorはnamespace単位の2次キャッシュを処理します。1次キャッシュはSqlSession/Executorのライフサイクル内にあります。2次キャッシュにはシリアライズと無効化時の整合性が絡むため、Redisキャッシュと同一視して扱うべきではありません。
4. プラグインチェーン
ページング、楽観ロック、テナント処理、データ権限はプラグインチェーン経由で実行されます。プラグインの順序、テナント条件、ページング、論理削除は結合テストで検証する必要があります。論理削除はデータが増加しなくなることを意味しません。アップグレード時は、固定バージョンのソースコードを基準にしてください。