問題描述:
在開發過程中,項目的主鍵生成器是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; }
以上。