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ファイルに飛べるので、そういったストレスは少なくていいですね。