1 SpringBoot中使用Jackson导致Long型数据精度丢失问题
原因:因为Javascript中数字的精度是有限的,bigint类型的的数字超出了Javascript的处理范围
解决:
1.1 配置参数write_numbers_as_strings
spring:
jackson:
generator:
write_numbers_as_strings: true
1.2 注解
@JsonSerialize(using=ToStringSerializer.class)
1.3 BigDecimal返回
@JsonFormat(shape = JsonFormat.Shape.STRING)
2 springboot 返回日期格式化时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
3 BigDecimal类型比较大小
if(a.compareTo(b) == -1){
System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
System.out.println("a小于等于b");
}
4 mybatis 比较大小符号对应关系
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
5 mybatisplus 常用符号
eq相等
ne、neq不相等,
gt大于,
lt小于
gte、ge大于等于
lte、le 小于等于
not非
mod求模
6 lombok 注解
@Cleanup,生成的代码会把变量用try{}包围,并在finallly块中调用close()
@SneakyThrows 用try{}catch{}捕捉异常
@Accessors setter链式返回,即setter的返回值为this
7 jdk1.8查重
List<String> repeatData = loginNames.stream().collect(Collectors.toMap(e -> e, e -> 1, Integer::sum))
.entrySet().stream().filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey).collect(Collectors.toList());
8 mysql常用语法
8.1 Date减一天并转换成字符串
DATE_FORMAT(date_add(NOW(), INTERVAL -1 DAY), '%Y-%m-%d')
8.2 删除重复数据
DELETE FROM t_table where id in (
select * from (
select id from t_table
WHERE bill_code IN (
SELECT bill_code FROM t_table
GROUP BY bill_code
HAVING count(bill_code) > 1)
AND id NOT IN (
SELECT max(id) FROM t_table
GROUP BY bill_code
HAVING count(bill_code) > 1
)) temp );
8.3 索引选择性
索引的选择性:不重复的索引值和记录总数的比值,最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高。
SELECT COUNT(DISTINCT user_id) / COUNT(*) AS user_id,
COUNT(DISTINCT area_type) / COUNT(*) AS area_type,
COUNT(*)
FROM area;
8.4 sql排查
查询死锁日志
show engine innodb status;
查询日志文件地址
SHOW VARIABLES LIKE 'datadir';
9 下划线与驼峰互相转换
public class LineHumpConvertUtil {
private static final Pattern LINE_PATTERN = Pattern.compile("_(\\w)");
private static final Pattern HUMP_PATTERN = Pattern.compile("[A-Z]");
/**
* 下划线转驼峰
*/
public static String line2Hump(String str) {
str = str.toLowerCase();
Matcher matcher = LINE_PATTERN.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* 驼峰转下划线
*/
public static String hump2Line(String str) {
Matcher matcher = HUMP_PATTERN.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
}
10 反射使用
10.1 对象转map后,排好序拼接成字符串
/**
* 将对象转换成map 排序后 拼接成string返回
*/
public static String getOrderMapToString(Object obj) {
StringBuilder stringBuilder = new StringBuilder();
Map<String, Object> targetMap = ClassUtil.setConditionMap(obj);
Map<String, Object> resultMap = Maps.newHashMapWithExpectedSize(targetMap.size());
// 依据key升序排序
targetMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
.forEachOrdered(e -> resultMap.put(e.getKey(), e.getValue()));
resultMap.forEach((k, v) -> {
if (!BaseConstant.PDD_EXCLUDE_COLUMN.equals(k)) {
stringBuilder.append(k).append(v);
}
});
return stringBuilder.toString();
}
/**
* 将一个类中string类型的字段加入到 map 空值时不加入
*/
private static Map<String, Object> setConditionMap(Object obj){
if(null == obj){
return null;
}
Field[] fields = obj.getClass().getDeclaredFields();
Map<String, Object> map = Maps.newHashMapWithExpectedSize(fields.length);
for(Field field : fields){
if ("java.lang.String".equals(field.getType().getName())) {
String fieldName = field.getName();
if(null != getValueByFieldName(fieldName,obj)) {
map.put(fieldName, getValueByFieldName(fieldName, obj));
}
}
}
return map;
}
/**
* 根据属性名获取该类此属性的值
*/
private static Object getValueByFieldName(String fieldName, Object object){
String firstLetter = fieldName.substring(0,1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
try {
Method method = object.getClass().getMethod(getter);
return method.invoke(object);
} catch (Exception e) {
return null;
}
}