java开发常用笔记

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 比较大小符号对应关系

原符号   <    <=    >    >=    &    '       "
替换符号 &lt; &lt;= &gt; &gt;= &amp; &apos; &quot;

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;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值