MyBatisのMapperはGroovyで書くことにした

MyBatisのMapperでSQL書くにあたって、複数行に渡るSQL書くのにヒアドキュメントが使いたくて、まずはKotlinを試しました。

ただ、ElicpseでKotlinを書こうとすると、importの自動補完が効かず、ちょっと面倒だったので、Groovyを試しました。(本当は、KotlinのままIntelliJ IDEAが導入できればいいんですが、、)

package com.example.repository

import org.apache.ibatis.annotations.Delete
import org.apache.ibatis.annotations.Insert
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param
import org.apache.ibatis.annotations.Select
import org.apache.ibatis.annotations.SelectKey
import org.apache.ibatis.annotations.Update
import org.springframework.stereotype.Repository

import com.example.domain.Customer

@Repository
@Mapper
public interface CustomerRepository {

    @Select("SELECT * FROM customers ORDER BY id")
    public List<Customer> findAll()

    @Select("SELECT * FROM customers WHERE id = #{id}")
    public Customer findOne(@Param("id") Integer id)

    @Insert("INSERT INTO customers(first_name, last_name, address) VALUES(#{firstName}, #{lastName}, #{address})")
    @SelectKey(statement = "call identity()", keyProperty = "id", before = false, resultType = int.class)
    public void insert(Customer customer)

    @Update("UPDATE customers SET first_name = #{firstName}, last_name = #{lastName}, address = #{address} WHERE id = #{id}")
    public void update(Customer customer)

    @Delete("DELETE FROM customers WHERE id = #{id}")
    public void delete(@Param("id") Integer id)

    @Select('''
      SELECT
        *
      FROM
        customers
      WHERE
        first_name LIKE '%${firstName}%'
      ORDER BY id''')
    public List<Customer> findByFirstName(@Param("firstName") String firstName)

    @Delete("DELETE FROM customers")
    public void deleteAll()
}

全体のコードは下記にあります。

ほとんどJavaで書いたときと同じになるのと、importの補完も効くので、今後MyBatisのMapperはGroovyで書こうと思っています。

ちなみに、他のファイル(MyBatisでも別ファイルにSQL書けます)にSQLを書くのではなく、ソース上に書きたいのは、やはり情報は一箇所にまとまっていたほうがわかりやすいと思っているからです。他のファイルに書くことによって、SQLの変更が楽になる(IDEでハイライトが利くとか)、、ってような話もありますが、きっと実行したSQLを貼り付けると思うので、どこに書いても正直同じだと思いますし、だったらコードと一緒に見えたほうがわかりやすいと思っています。(Javaがヒアドキュメント使えていれば、他のファイルにSQL書くような流れって、もっとすくなかったのでは)

DomaはIDE上でメソッドに対応するSQLファイルに飛べるので、そういったストレスは少なくていいですね。