きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

SQLJavaConfiguraitonなんてものを考えてみた

SpringのJavaConfigと似たイメージでとりあえず叩き台を書いてみた。
まあ構想だけで、実装は追いついてない。
iBATISばかり使っていた過去があるので、SQL文の表記方法は似たところがあるのだが、「ユーザー関数(java)を組み込める」という点が大きく違うはずだ。
このユーザー関数があれば、iBATISやらのタグは全部自前で書ける。
このユーザー関数は、DB的な関数ではないので間違えないように。
SQLをどのように動的に組み立てるかにおいてこのユーザー関数の役割は大きい。
コンセプトはシンプルなんだけど、ちゃんと実装できるかなー。

つーか友達の結婚式のために広島に帰っているのに、なんでこんなもんを編み出してんだっけ・・・。


@SQLJavaConfiguration(namespace="sample")
public class TestSQLJavaConfiguration{

// ${}が文字列置換、#{}がPreparedStatementの?になる。iBATISイメージだろ?
// $@{}が関数呼び出し。
// $@{}、${}、#{}の順に解決するようにFWを実装すればいい。
// 関数の中に書いてある関数「$@{hoge(name,$@{foo(#{foo})})}」もサポートしたいところではある。
@SELECT(fetchSize=100)
public String select1(){
return "SELECT * FROM ${tableName} WHERE ID $@{isNull(id,#{id})} " + scrap;
}


// nullではない場合、プレースホルダーにして欲しい場合はこんな具合に書くだろう。
// プレースホルダーでなくて良いなら()、valueを埋め込めば良い。
@Function
public String isNull(String name,Object value){
if(value == null){
return "is null";
}else{
return "== #{" + name + "}";
}
}


// これ自体はただの分割表記であって、ユーザー関数ではない。だからアノテーションはいらない。
// $@{}がユーザー関数呼び出し
private String scrap(){
return $@{andInList(country,countryList,#{countryList})};
}

// isNullおよび,AND,、IN句の組み合わせを1つの関数に纏めたらこんな具合。
@Function
public String andInList(String columnName, String name, List countryList){
if(countryList == null || countryList.size() == 0){
return "";
}

StringBuilder sb = new StringBuilder();
sb.append(" AND ");
sb.append(columnName);
sb.append(" IN (");
for(int i = 0,size = countryList.size();i