end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

(改x2) spring boot for java + mybatis で sql動的生成 - WHERE IN句 や OR句

(改) 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