业务代码中常用的小技巧

业务代码中常用的小技巧,第1张

1、数据量大时,分割查询列表,分批查询

List> partition = Lists.partition(venderCodeList, 1_000);
for (List perList : partition) {
    //查询 *** 作...
}

2、 FIND_IN_SET函数:单个字段中存储列表数据,以逗号分隔,需要匹配其中某些元素时

//示例:province_codes存储S002,S008,S009,S011
select * from commodity_pool_apply_order where FIND_IN_SET('S002',province_codes);

3、Mybatis批量插入

 
    insert into t_user(user_name, age, sex, telno, email, address)
    values
    
        (#{item.userName}, #{item.age}, #{item.sex}, #{item.telno}, #{item.email},
        #{item.address})
    
  

4、Mybatis查询条件是where (a='xxx' and b='yyy') or (a='xxx1' and b='yyy1')

  

5、Mybatis查询条件是 code in (...)


    and shop_code in
	
        #{item}
    

6、Mybatis查询条件有特殊字符,把有特殊字符的语句放在 中,尽量缩小 的范围


    = #{shipQueryVO.createdTimeStart,jdbcType=TIMESTAMP}
    ]]>

7、Mybatis insert返回自增主键并设置到实体对象中


    insert into base_brand values(.....)

8、jsqlparser解析sql提取表名


    com.github.jsqlparser
    jsqlparser
    4.2
private static Set getTableNames(String sql) {
    Statement statement = null;
    try {
        statement = CCJSqlParserUtil.parse(sql);
    } catch (JSQLParserException e) {
        throw new ProductCenterQueryException("解析sql语句错误!sql:" + sql);
    }
    TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
    List tableList = tablesNamesFinder.getTableList(statement);
    Set tableNames = new HashSet<>();
    for (String tableName : tableList) {
        //获取去掉“`”的表名
        if (tableName.startsWith("`") && tableName.endsWith("`")) {
            tableNames.add(tableName.substring(1, tableName.length() - 1));
        } else {
            tableNames.add(tableName);
        }
    }

    return tableNames;
}

9、MQ消息幂等处理(redis实现方式)

//MqMessageCacheDataUtil类中定义幂等判断逻辑
public static Boolean putMqMessage(String formInstanceId,String messageId){
    if(StringUtils.isBlank(formInstanceId) || StringUtils.isBlank(messageId)){
        return true;
    }
    String key = getKey(formInstanceId);
    if(redisUtils.hashKey(key,messageId)){
        return false;
    }
    redisUtils.hashPut(key,messageId,"");
    redisUtils.expire(key,EXPIRETIME, TimeUnit.SECONDS);
    return true;
}

//幂等校验
if(!MqMessageCacheDataUtil.putMqMessage(vo.getFormInstanceId(),vo.getUuId())){
    log.info("重复消息,消息已消费:"+vo.getFormInstanceId()+":"+JSON.toJSONString(vo));
    return;
}
//通过幂等校验,执行后续业务逻辑
.....

10、lombok使用

//开启链式编程
@Accessors(chain = true)

//创建一个无参构造函数
@NoArgsConstructor

//创建一个含有所有已声明字段属性参数的构造函数
@AllArgsConstructor

//生成toString()方法的实现,将callSuper设置为true,可以将toString的父类实现的输出包含到输出中
@ToString(callSuper = true)

//生成equals(Object other) 和 hashCode()方法
@EqualsAndHashCode(callSuper = true)

//用于属性,结合类上标注@ToString或@EqualsAndHashCode使用
@ToString.Include(name =“some other name”)
@ToString.Exclude

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/737411.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-28
下一篇2022-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存