投稿‎ > ‎

MyBatisで任意のSQLを実行する

posted Sep 4, 2013, 8:17 AM by Zhang Wenxu   [ updated Nov 18, 2013, 1:02 AM ]
XMLを書かず、MyBatisで任意のSQLを実行する方法を紹介します。
元々に質問は、こちらです。

How to run arbitrary sql with mybatis?


I use this utilitary class:

import java.util.List;
import org.apache.ibatis.annotations.SelectProvider;

public interface SqlMapper {
    static class PureSqlProvider {
        public String sql(String sql) {
            return sql;
        }

        public String count(String from) {
            return "SELECT count(*) FROM " + from;
        }
    }

    @SelectProvider(type = PureSqlProvider.class, method = "sql")
    public List<?> select(String sql);

    @SelectProvider(type = PureSqlProvider.class, method = "count")
    public Integer count(String from);

    @SelectProvider(type = PureSqlProvider.class, method = "sql")
    public Integer execute(String query);
}
answered Nov 16 '12 at 18:28
italo
1,756920
ただし、select結果のタイプを指定されてないため、そのままだと、UnsupportedOperationException例外が発生してしまいます。
解決方法2つあります。
1.結果オブジェクトを指定する方法
例:public List<?> select(String sql);
の中に?の代わりに、実際にオブジェクトタイプEmpを指定する。

この方法は、SQLと結果オブジェクトが緊結合になってしまって、やはり表題の任意のSQLを実行できないです。
2.結果オブジェクトはMapとする
public List<?> select(String sql);
の中にある?の代わりに、Mapを指定する。
そうすれば、結果はMapのリストになり、Mapにselect結果の項目名と値が入っています。使い方は結構便利ですよ。
特にテストデータ準備、テーブルにデータ検証にには、かなり便利のツールとして使えます。
Google+
By Zhang Wenxu
Comments