(改) spring boot for java + mybatis で sql動的生成 - end0tknr's kipple - web写経開発
上記entryに対して、更に追記。
org.apache.ibatis.jdbc.SQL を更に試していますが、 WHERE IN句 や OR句 の使用方法が、よく分からなかった為、メモ。
package jp.end0tknr; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.jdbc.SQL; public class UserMstSqlProvider { public String findByWhereIn(String userId, Integer[] kyotenIds) { SQL sql_1 = new SQL(); sql_1.SELECT("*").FROM("user_mst").WHERE("user_xmileid LIKE '${userId}%'"); //sql_1.WHERE("(is_delete=0 OR is_delete=1)"); // ↑こう書きたくなかった為、↓こう書きましたが、これもちょっとなぁ... SQL sql_2 = new SQL(); sql_2.SELECT().FROM(); sql_2.WHERE("is_delete=0").OR().WHERE("is_delete=1"); String sql_2str = sql_2.toString().replaceAll("^WHERE ","").replaceAll("\n"," "); sql_1.WHERE("("+sql_2str+")"); // org.apache.ibatis.jdbc.SQL には、WHERE IN句 に特化した methodが // ないらしく、以下のように書きましたが、こちらも美しくない感じ String[] whereInArgs = new String[ kyotenIds.length ]; for (int i = 0; i < kyotenIds.length; i++){ whereInArgs[i] = "#{kyotenIds["+i+"]}"; } sql_1.WHERE( "kyoten_id in ("+ String.join(",",whereInArgs) +")"); sql_1.LIMIT(1); String sqlStr = sql_1.toString(); System.out.println("SQL:" + sqlStr); return sqlStr; } // camel -> snake 変換 public String toSnakeStr(String camel) { String snake = StringUtils.join( StringUtils.splitByCharacterTypeCamelCase(camel), "_") .toLowerCase(); //数字の前には「_」不要 snake = snake.replaceAll("(_)([0-9])", "$2"); return snake; } }
上記の findByWhereIn(String userId, Integer[] kyotenIds) により、 以下のsqlが発行されます。
SQL:SELECT * FROM user_mst WHERE (user_xmileid LIKE '${userId}%' AND ((is_delete=0) OR (is_delete=1)) AND kyoten_id in (#{kyotenIds[0]},#{kyotenIds[1]},#{kyotenIds[2]},#{kyotenIds[3]}) ) LIMIT 1