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パラメータに無事バインドできました。