MyBatis/Tips

内部実装について

Mapで順番を固定したい

MyBatisでResultType="map"を指定した場合、実装はHashMapを使っているのでSQLで指定したカラムの順番は保証されない。

(DefaultObjectFactory#resolveInterface(Class))

XMLの場合

mapperをXMLで記載している場合は簡単

カラムの順番が重要な場合(拡張for文で回したいとか)は、ResultType="LinkedHashMap"を指定する。

mapperアノテーションの場合

(MyBatis3から導入された)アノテーションで記載したい場合、@MapKeyにクラス指定はできないので発想を変える必要がある。

一番簡単なのはDefaultObjectFactoryを継承したクラスを用意して、Mapインターフェースの実装をLinkedHashMapに変えてしまうというやり方。

その場合、mybatis-config.xmlを変更する必要がある(SqlSessionFactoryをConfiguraiton使って生成していることはあまりないと思うが考え方は一緒)。

すでにパッチが提供されているのでそのとおりにするだけ

https://github.com/mybatis/mybatis-3/tree/master/src/test/java/org/apache/ibatis/submitted/result_handler_type