ついに!?2016年4月9日(昨日!!)にmybatis-typehandlers-jsr310のバージョン1.0.0がリリースされました。mybatis-typehandlers-jsr310には、JSR-310 Date and Time API用のタイプハンドラーが格納されています。
これまでは、独自にタイプハンドラーを作成するか、またはEntityなどのJavaBeanにはレガシーなjava.util.Date
, java.sql.Time
, java.sql.Date
, java.sql.Timestamp
を使っていたと思いますが、Java 8のリリースから2年が経ち、ようやくMyBatisでもJSR-310の日時型が使えるようになりました
バージョン 1.0.1
2016年6月26日にバージョン1.0.1がリリースされ、java.time.Year
とjava.time.Month
がサポートされました。
バージョン 1.0.2
2017年1月2日にバージョン1.0.2がリリースされ、java.time.YearMonth
とjava.time.chrono.JapaneseDate
がサポートされました。
mybatis-typehandlers-jsr310を依存アーティファクトに追加
MyBaitsは、最新のJavaバージョンから2つ下のバージョン(現時点だとJava 6)までサポートするというポリシーがあるらしく、Java 8以上が必要となるJSR-310用のタイプハンドラーは専用のアーティファクトとして提供されています。
そのため、Mybatis本体とは別に、mybatis-typehandlers-jsr310を依存アーティファクトに追加する必要があります。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version> <!-- バージョンは最新を指定 (2017/1/2時点では1.0.2が最新) -->
</dependency>
タイプハンドラーをMyBatisに登録
MyBatis 3.4以上を使用する場合は、自動でJSR-310用のタイプハンドラーがMyBatisに登録される仕組みになっているため、特になにもする必要はありません。
MyBatis 3.3.x以下のバージョンを使用する場合は、MyBatis設定ファイルやMyBatis-Springから提供されているSqlSessionFactoryBean
を使用して、明示的にタイプハンドラーを登録する必要があります。
Note:
MyBatis 3.4以上を使っている場合でも、メンテナンスバージョンによって自動登録される対象が異なるため、明示的に登録しないと使えないタイプハンドラーがあります。
以下は、MyBatis設定ファイルを使用してタイプハンドラーを登録する際の設定例です。
<typeHandlers>
<!-- ↓ MyBatis 3.3.x以前の場合は指定が必要 -->
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
<!-- ↓ MyBatis 3.4.0以前の場合は指定が必要 -->
<typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
<!-- ↓ MyBatis 3.4.1以前の場合は指定が必要 -->
<typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>
ドメインオブジェクトにJSR-310の日時型を使用
EntityなどのドメインオブジェクトにJSR-310の日時型を指定するだけで、JDBCの対応型(java.sql.Time
, java.sql.Date
, java.sql.Timestamp
)に相互変換できます。
package com.example.domain;
public class Todo {
private int id;
private String title;
private String details;
// private java.sql.Date deadlineDate;
private java.time.LocalDate deadlineDate; // JSR-310のLocalDateを指定
private boolean finished;
// ... setter and getter
}
まとめ
オレオレTypeHandlerではなく、mybatis-typehandlers-jsr310を使いましょう。
そして、java.util.Date
やjava.util.Calendar
などのレガシーな日時型を使うのではなく、積極的にJSR-310のAPIを使いましょう。