システムエンジニアの子育て

子育てや、仕事、日々の生活で感じたことを発信していきます。

MyBatisをバージョンアップしたらLocalDateTimeがマッピングされなくなった

職場でO/R mappingであるMyBatisを使用しています。
バージョンが古かったため、バージョンアップをしたらLocalDateTimeがマッピングされなりました。
結構ハマったのでメモ的な形で記録しておきます。

前提

mybatis-spring-boot-starter 1.3.2 → 2.1.1
に変更

バージョンアップ後のエラー

バージョアップ後にテストをしてみると、以下のエラーメッセージが表示された。

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='now', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException:

この「now」という変数はjava.time.LocalDateTimeでマッピングされるようにしていたため、MyBatis側でLocalDateTimeが認識されていないような挙動をしている。
以前のMyBatisのアップデートでLocalDateTimeは対応されていたはずなので、この事象が不明。

原因の特定

ググっていたところ、以下の記載を発見
https://github.com/mybatis/mybatis-3/issues/1549

要約すると、最新のMyBatisではLocalDateTypeHandlerが更新され、JDBC4.2をサポートするドライバが必要になった模様。
データベースはOracleを使用していて、ドライバはojdbc7を使用していた。

JBDC4.2がサポートされているドライバはojdbc8以降とのことだったため、oracleダウンロードページからojdbc8のドライバをダウンロード。

まさかojdbcが影響していたとは・・・

動作確認

ドライバを更新したあとに再実行したら正常にマッピングされることを確認。
意外と原因の特定までに時間を要してしまった・・・