20240113
ccnaive 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'}
是一个三元表达式,用于动态生成排序语句中的ASC
或DESC
关键字。由于ASC
和DESC
不需要预编译处理,因此使用${}
占位符是合适的。而对于动态生成 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();
}
}