1. Mybatisで拡張可能なクラス
Mybatisでは、いくつかのタイミングで処理をインターセプトすることができます。
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- StatementHandler (prepare, parameterize, batch, update, query)
- ParameterHandler (getParameterObject, setParameters)
前回の記事にある、アプリケーション構成についてのインフラストラクチャ層にて、 DBへパラメータを渡す前や、受け取った後に独自の処理を追加拡張することができます。
図1-1 Mybatis内の処理順序と拡張可能クラスの実行タイミング
2. 使用例
DBのVARCHAR等にNULLのデータがあった場合に
サーバサイド側で扱う際に、インフラストラクチャ層側で
NULLの場合に特定の文字(0 byte文字等)を常に設定することで、
NullPointerException を防ぐことができます。
実装例
public class OriginalStringTypeHandler extends BaseTypeHandler<String> { /** * <pre> * DBから取得した値の変換処理です。 * </pre> * * @param rs * リザルトセット * @param columnName * カラム名 * @return カラムデータ */ @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.convertNullString(rs.getString(columnName)); } /** * <pre> * null の変換処理です。 * </pre> * * @param data * 取得文字列 * @return 変換後文字列 */ private String convertNullString(String data) { String result = ""; if (StringUtils.isNotEmpty(data)) { result = data; } return result; }