本家はこちら
mybatisでカスタムでクエリ書くときに、標準だとxml形式で書かなきゃいけなくて、結構しんどい。
カンタンに書くと下のような感じ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jp.sample.MapperCustom">
<delete id="deleteAll" parameterType="map">
delete from ${table}
</delete>
<insert id="bulkInsert" parameterType="map">
insert into ${table}
(code)
values
<foreach item="v" collection="list" separator=",">
(#{v})
</foreach>
</insert>
</mapper>
つらいポイント - xml形式なので、余計なものが先頭に来てつらい - 繰り返しがつらい
なんかたくさんあるかと思いきや、あんまり挙げられなかったのだが、とにかくXMLというのが辛い。不等号もxml形式なので、CDATA
を利用してかかないければならないのとか、そうしないなら、エスケープしないといけないのが辛かった。
Groovyとかkotlinだとmulti line strings が使用できる話だが、Groovyだと大きいJarを入れないとだし、kotlinだとnull値が。。。みたいな問題に悩まされるんじゃないかという気がしたので、mybatis freemarker template
を使う方法を選択した。
使い方
ライブラリの追加
gradleのdependencies
に下記を追加
compile("org.mybatis.scripting:mybatis-freemarker:$mybatisFreemakerVersion")
freemarkerテンプレートを置き場指定
src/main/resources 直下にmybatis-freemarker.properties
のファイルを設置する
内容は、mybatis-freemarkerを使う際にどのディレクトリを参照するかなので、classpath内の任意のディレクトリパスを記述する。
basePackage=mybatis/sql
freemarker templateにクエリを書く
src/main/resources/mybatis/sql/sample.ftl
select
name
from
sample
where
id in (${ids?join(", ")})
and
name = <@p name="n">
mapperインターフェース内にfreemarker templateの呼び出しを書く
@Lang(FreeMarkerLanguageDriver.class)
@Select("sample.ftl")
List<Name> findNamesByIds(@Param("n") String name,@Param("ids") List<Integer> ids);
以上のように書けば、実行できる。なんかかなりスッキリしたよい感じになる。デメリットとしては、1SQLで1ファイル使うので結構ファイルの数は増える。ディレクトリ等を使えば、スッキリはすると思うので、大したデメリットにはならないと思う。