[Done]SnowFlake生成Long類型主鍵返回前台過長導致精度缺失的問題


問題描述:

在開發過程中,項目的主鍵生成器是SnowFlake,其生成的long主鍵是28位,

但是js中Long的最大值:https://blog.csdn.net/sunmerZeal/article/details/80844843 是26位,

所以當18位的long主鍵往前台傳時,就導致了精度缺失,再往后傳id進行更新或刪除操作時,id就匹配不到位。

 

解決過程:

解決思路1:

     首先想的是將后台主鍵由long類型改為String類型,組里幾位小伙伴討論后,有經驗的大牛給出建議說,mysql主鍵long的性能要優於String類型。

這篇文章里有比較詳細的介紹https://blog.csdn.net/HeatDeath/article/details/79833462

同時Long改String 還設計表結構的修改,改動面比較大,所以最終放棄了這個方案。

 

解決思路2:

      抽象出父類通用屬性,將Long修改為Object類型,Bean修改如下:

然后在返回前台的controller里,返回的最后一步進行Long2String類型轉換;當請求往后台走時,第一步也是String2Long的轉換,如下:

    // 數據往前台傳, 為解決前台long長度過長導致的精度缺失
    public static List idsLong2String(List<? extends CommonDO> li){
        if(li == null || li.size() == 0){
            return li;
        }
        for (CommonDO bean : li ){
            bean.setId(bean.getId().toString());
        }
        return li;
    }
    // 數據由前台往底層傳, String轉Long以匹配底層long類型主鍵
    public static List idsString2Long(List<? extends CommonDO> li){
        if(li == null || li.size() == 0){
            return li;
        }
        for (CommonDO bean : li ){
            bean.setId(TransformUtil.getLong(bean.getId()));
        }
        return li;
    }

 

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM