20240113

2024/1/13

# 1 动态排序 desc asc

# ${} #{}

        <if test="req.orders != null and orders.size() > 0">
            ORDER BY
            <foreach collection="orders" item="order" separator=",">
                <choose>
                    <when test="order.column == 'create_time'">
                        culture.create_time ${order.asc ? 'ASC' : 'DESC'}
                    </when>
                    <otherwise>
                        ent.${order.column} ${order.asc ? 'ASC' : 'DESC'}
                    </otherwise>
                </choose>
            </foreach>
        </if>

${}#{} 都是 MyBatis 中用于动态生成 SQL 语句的占位符,但它们的使用方式和含义不同。

${} 是文本替换,它会直接将传入的参数值按照字符串的形式替换到 SQL 语句中。在 SQL 解析阶段,${} 占位符会被真实的参数值所替换。因此,${} 可以用于动态生成 SQL 语句中的列名、表名、排序等不需要通过预编译处理的部分。但使用 ${} 会存在 SQL 注入的风险,因为用户输入的内容会直接拼接到 SQL 语句中,可能导致 SQL 注入攻击。

#{} 是预编译处理,它会将传入的参数值替换成一个占位符 ?,并将该占位符加入到 SQL 语句中。在 SQL 执行阶段,#{} 占位符会被预编译过的参数值所替换。因此,#{} 可以用于动态生成 SQL 语句中的条件语句、参数值等需要通过预编译处理的部分。使用 #{} 可以有效地防止 SQL 注入攻击。

在上面提供的代码中,${order.asc ? 'ASC' : 'DESC'} 是一个三元表达式,用于动态生成排序语句中的 ASCDESC 关键字。由于 ASCDESC 不需要预编译处理,因此使用 ${} 占位符是合适的。而对于动态生成 SQL 语句中的条件语句或参数值等,建议使用 #{} 占位符。

# 2 驼峰转下划线 util

public class CamelCaseToUnderscoreUtils {

    private static final Pattern CAMEL_CASE_PATTERN = Pattern.compile("([a-z])([A-Z])");

    public static String convert(String camelCaseString) {
        Matcher matcher = CAMEL_CASE_PATTERN.matcher(camelCaseString);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1) + "_" + matcher.group(2).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString().toLowerCase();
    }
}

# 3 IPUtil

public class IpUtil {

    /**
     * 获取当前HTTP请求发起者的IP地址
     *
     * @return 请求者的IP地址字符串
     */
    public static String getRequesterIpAddress() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            return request.getRemoteAddr();
        } else {
            throw new IllegalStateException("Cannot obtain the requester IP address outside of a web request context.");
        }
    }

}

# 4 手机号校验 util

/**
 * 手机号校验工具类
 */
public class PhoneNumberValidator {
    private static final String PHONE_NUMBER_REGEX = "^1[3-9]\\d{9}$";
    private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile(PHONE_NUMBER_REGEX);

    public static boolean isValidPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
            return false;
        }
        return PHONE_NUMBER_PATTERN.matcher(phoneNumber).matches();
    }
}