• 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!


    一 SUBSTRING_INDEX函数介绍

    作用:按关键字截取字符串 
    substring_index(str,delim,count) 
    说明:substring_index(被截取字段,关键字,关键字出现的次数) 
    例:select substring_index("她说,我是个好人,怎么办",",",2);
    结国如图:

    会从关键字第二次出现的位置开始截取.

    但是如果次数是负数,则会从后往前截取,比如

    从后面开始到,第二次出现的位置往前截取,这样就为编码方式提供了很好的实现技术支持!

    二 编码思路

    取要编码的名字的首字母大写,数字就是数字加下划线,后面再拼数字,从0开始,如果有重复的就加一,所以在保存数据的时候,得先去数据库里查询相同编码的下划线后面的数字,然后取个最大值,没有就取0,最后新数据的编码后面的数字就是这个最大值加一,可能有点绕,看代码就行:

    String jianpin = PinYinUtil.getFirstSpell(roleName).toUpperCase();
    //简拼相同的截取后面的数字取最大的一个
    Integer maxJanpinNum = 0;
    maxJanpinNum = getMaxJanpinNum(jianpin,projectId);
    //设置字典编码
    pmRole.setRoleCode(jianpin + "_" + maxJanpinNum);
    dao.save(pmRole);

    这一段是主逻辑,我们再看获取数字的方法代码:

    public Integer getMaxJanpinNum(String jianpin,String projectId) {
    Map<String, Object> param = new HashMap<>();
    param.put("jianpin", jianpin);
    param.put("projectId", projectId);
    //简拼相同的截取后面的数字取最大的一个
    Object maxJanpinNum = dao.getOneBySQL("pm.project.getMaxJanpinNum",param);
    if(maxJanpinNum==null){
    return 0;
    }
    return Integer.parseInt(maxJanpinNum.toString())+1;
    }

    最后我们再看这个sql:

    <select id="getMaxJanpinNum" resultType="Integer">
    <![CDATA[
    select max(SUBSTRING_INDEX(t.dict_code,'_',-1)) from app_dict t where t.dict_code like concat(#{jianpin},'%') and dict_code=#{dictcode}
    ]]>
    </select>

    无非就是根据拼音模糊检索前缀相同编码的编码,然后利用这个函数从后往前截取到最后这个数字,再取数字中最大的一个,这样,不同的拼音最后一个肯定是0,然后依次累加,这样就解决了编码重复的问题.

  • 相关阅读:
    HDU 3999 The order of a Tree (排序二叉树的先序遍历)
    如何从 100 亿 URL 中找出相同的 URL?
    Tomcat源码分析 | 一文详解生命周期机制Lifecycle
    SqlSession与SqlSessionFactory到底是什么关系?
    spring boot-jpa整合QueryDSL来简化复杂操作
    EasyExcel读写Excel
    如何将List集合中相同属性的对象合并
    @Data 注解引出的 lombok
    MySQL配置连接
    Django创建
  • 原文地址:https://www.cnblogs.com/houzheng/p/8778310.html
Copyright © 2020-2023  润新知