コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

MirageでINパラメータを指定できるか確認

2WaySQLが使えるシンプルなデータベースアクセスライブラリーのMirageでINパラメータが使えるか確認してみました。

Mirageプロジェクトは以下のページを参照して下さい。
http://amateras.sourceforge.jp/site/mirage/welcome.html

もともと2WaySQLの部分はS2Daoから持ってきているようなので、ListからINパラメータは作成できるだろうとは思っていましたが、ドキュメントには記載がなかったので試してみました。

コードはmirage/src/test/java/jp/sf/amateras/mirage/parser/SqlParserImplTest.java at master · takezoe/mirage · GitHubのソースをもとにJUnitテストとして確認しました。

package mirage.test;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List;

import jp.sf.amateras.mirage.parser.Node;
import jp.sf.amateras.mirage.parser.SqlContext;
import jp.sf.amateras.mirage.parser.SqlContextImpl;
import jp.sf.amateras.mirage.parser.SqlParser;
import jp.sf.amateras.mirage.parser.SqlParserImpl;

import org.junit.Test;

public class SqlParserTest {

    @Test
    public void ListによるINパラメータのテスト() {
        SqlParser parser = new SqlParserImpl(
                "SELECT * FROM USER WHERE UNIT_ID IN /*user.unitList*/('01')");
        Node node = parser.parse();

        UserDto user = new UserDto();
        user.unitList = new ArrayList<String>();
        user.unitList.add("01");
        user.unitList.add("02");
        SqlContext context = new SqlContextImpl();
        context.addArg("user", user, UserDto.class);

        node.accept(context);

        assertThat(context.getSql(),
                is("SELECT * FROM USER WHERE UNIT_ID IN (?, ?)"));
        assertThat(context.getBindVariables().length, is(2));
        assertThat(context.getBindVariables()[0].toString(), is("01"));
        assertThat(context.getBindVariables()[1].toString(), is("02"));
    }

    @Test
    public void ListによるINパラメータのテストでBEGINで囲む() {
        SqlParser parser = new SqlParserImpl(
                "SELECT * FROM USER/*BEGIN*/ WHERE UNIT_ID IN /*user.unitList*/('01') /*END*/");
        Node node = parser.parse();

        UserDto user = new UserDto();
        user.unitList = new ArrayList<String>();
        SqlContext context = new SqlContextImpl();
        context.addArg("user", user, UserDto.class);

        node.accept(context);

        assertThat(context.getSql(), is("SELECT * FROM USER"));
        assertThat(context.getBindVariables().length, is(0));
    }

    @Test
    public void 配列によるINパラメータのテスト() {
        SqlParser parser = new SqlParserImpl(
                "SELECT * FROM USER WHERE UNIT_ID IN /*user.unitArray*/('01')");
        Node node = parser.parse();

        UserDto user = new UserDto();
        user.unitArray = new String[] { "03", "04", "05" };
        SqlContext context = new SqlContextImpl();
        context.addArg("user", user, UserDto.class);

        node.accept(context);

        assertThat(context.getSql(),
                is("SELECT * FROM USER WHERE UNIT_ID IN (?, ?, ?)"));
        assertThat(context.getBindVariables().length, is(3));
        assertThat(context.getBindVariables()[0].toString(), is("03"));
        assertThat(context.getBindVariables()[1].toString(), is("04"));
        assertThat(context.getBindVariables()[2].toString(), is("05"));
    }

    public static class UserDto {
        public List<String> unitList;
        public String[] unitArray;
    }
}

結果としては、Listでも配列でもINパラメータに無事バインドできました。