提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
案例仅供参考,如有错误,欢迎大佬指点留言.
一、模糊查询:特殊字符
注意:全局使用,可以使用拦截器进行,拦截器请求,再进行内容替换。
/**
* @Description : 分页模糊查询:特殊字符处理
* @Author : LiYan
*/
public class SpecialStrUtil {
private SpecialStrUtil() {}
public static String escapeStr(String str) {
if (StringUtils.hasText(str)) {
str = str.replace("!", "\\!");
str = str.replace("_", "\\_");
str = str.replace("%", "\\%");
str = str.replace("*", "\\*");
str = str.replace("^", "\\^");
str = str.replace("[]", "\\[]");
str = str.replace("[", "\\[");
str = str.replace("]", "\\]");
}
return str;
}
}
// 原文链接:https://blog.youkuaiyun.com/weixin_39157014/article/details/114313702
二、位运算 (Binary)
代码如下(示例):
// 01011001
// 11111101
// 位运算:
// | 按位或 11111101 253 都为0则为0
// & 按位或 01011101 89 都为1则为1
// ^ 按位异或 不同为1,相同为0
// ~ 按位非 10100010 取相反值.
int result = 89 & 253; // 相同位上的值为1,则为1.
// 拆分单个位.
int number = 255;
System.out.println("Binary0:" + (number & 1) );
System.out.println("Binary1:" + ((number & 2) >> 1) );
System.out.println("Binary2:" + ((number & 4) >> 2) );
System.out.println("Binary3-5位:" + ((number & 56) >> 3)); // 8+16+32 = 56
System.out.println("Binary6:" + ((number & 64) >> 6));
System.out.println("Binary7:" + ((number & 128) >> 7));
// 组合成一个二进制.
int bit0 = number0;
int bit1 = number1 << 1;
int bit2 = number2 << 2;
int bit3 = number3 << 3;
int bit6 = number6 << 6;
int bit7 = number7 << 7;
int sum = bit0 + bit1 + bit2 + bit3 + bit6 + bit7;
三、捕捉空指针异常
/**
* 空指针异常
* @param ex
* @return
*/
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public Result<Object> exceptionHandler(NullPointerException ex) {
Result<Object> responseResult=new Result<>();
responseResult.setCode(ResultCodeEnum.FAIL.getCode());
responseResult.setMessage(ResultCodeEnum.FAIL.getMessage());
log.error("NullPointerException:"+ex.getMessage());
return responseResult;
}
四、打印SQL语句不带?号
注:p6spy依赖包:性能监控、sql打印不带?号.
参考链接
- 依赖包
<!-- 依赖包-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
- 添加名称为:spy.properties文件
# spy.properties配置文件:
module.log=com.p6spy.engine.logging.P6LogFactory
# 实际驱动
realdriver=org.postgresql.Driver
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
# 使用日志系统记录sql
appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 秒
outagedetectioninterval=2
五、集合 TreeSet 、HashMap
TreeSet :去重,存在不允许插入。
HashMap:对象存在,则覆盖。
// 1. treeSet: 去重,不能覆盖旧,存在,则不允许插入。
// 2. HashMap<>():对象存在,会进行覆盖.
Map<String, ConsumerMessageData> dataMap = listMessage.stream()
.map(message -> JSON.parseObject(message.value(), ConsumerMessageData.class))
.collect(Collectors.toMap(ConsumerMessageData::getSn, data -> data, (oldValue, newValue) -> newValue));
六、比较两对象属性值
/**
* 比较两个对象属性值,相同则进行展示,不同不展示.
* @param obj1 对象1
* @param obj2 对象2
* @return
* @throws IllegalAccessException
*/
public static List<Diff> compareObjects(Object obj1, Object obj2) throws IllegalAccessException {
List<Diff> diffs = new ArrayList<>();
// 获取对象的所有属性
Field[] fields = obj1.getClass().getDeclaredFields();
// 遍历属性,比较值是否相同
for (Field field : fields) {
// 允许在私有字段上执行操作
field.setAccessible(true);
//获取obj1 对象中当前属性值
Object value1 = field.get(obj1);
Object value2 = field.get(obj2);
// 属性值不同,则进行封装.
if (value1 != null && !value1.equals(value2)) {
Diff diff = new Diff();
diff.setSource(value1);
diff.setTarget(value2);
diff.setFieldName(field.getName());
// 保存结果集
diffs.add(diff);
}
}
return diffs;
}