SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹_第1頁
SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹_第2頁
SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹_第3頁
SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹_第4頁
SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第SpringBoot分頁的實現(xiàn)與long型id精度丟失問題的解決方案介紹目錄一.分頁查詢的實現(xiàn)二.禁/啟用員工賬號三.數(shù)值轉(zhuǎn)換器的使用

一.分頁查詢的實現(xiàn)

在做分頁查詢時流程如下:

頁面發(fā)送ajax請求,將分頁查詢參數(shù)(page、pageSize、name)提交到服務(wù)端,服務(wù)端Controller層接收頁面提交的數(shù)據(jù)并調(diào)用Service層查詢數(shù)據(jù),Service調(diào)用Mapper操作數(shù)據(jù)庫,查詢分頁數(shù)據(jù),Controller層將查詢到的分頁數(shù)據(jù)響應(yīng)給頁面

具體實現(xiàn):

1.設(shè)置分頁攔截器,拿到對象當(dāng)作Bean交給Spring管理

@Configuration

publicclassMyBatisPlusConfig{

@Bean

publicMybatisPlusInterceptormybatisPlusInterceptor(){

MybatisPlusInterceptormybatisPlusInterceptor=newMybatisPlusInterceptor();

mybatisPlusInterceptor.addInnerInterceptor(newPaginationInnerInterceptor());

returnmybatisPlusInterceptor;

2.Controller層中創(chuàng)建分頁對象,編寫分頁條件

@GetMapping("/page")

publicRPagepage(intpage,intpageSize,Stringname){

("page={},pageSize={},name={}",page,pageSize,name);

//構(gòu)造分頁構(gòu)造器

Pagepage1=newPage(page,pageSize);

//構(gòu)造條件構(gòu)造器

LambdaQueryWrapperEmployeelqw=newLambdaQueryWrapper();

//分頁條件

lqw.like(StringUtils.isNotEmpty(name),Employee::getName,name);

//添加排序

lqw.orderByDesc(Employee::getUpdateTime);

//執(zhí)行查詢

employeeService.page(page1,lqw);

//返回分頁頁面信息

returnR.success(page1);

}

返回的分頁信息響應(yīng)結(jié)果(response)如下:

推薦一個json格式轉(zhuǎn)換神器:JSON轉(zhuǎn)換神器

{!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--"code":1,"msg":null,"data":{!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--"records":[{!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--"id":"1576900298836086785","username":,"name":"懶羊羊","passsword":"e10adc3949ba59abbe56e057f20f883e","phone":,"sex":"1","idNumber":,"status":0,"createTime":"2025-10-0319:41:43","updateTime":"2025-10-0623:01:27","createUser":"1","updateUser":"1"},{!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--"id":"1576934844579266561","username":"24553880","name":"懶羊羊","passsword":"e10adc3949ba59abbe56e057f20f883e","phone":,"sex":"1","idNumber":,"status":1,"createTime":"2025-10-0321:59:00","updateTime":"2025-10-0623:01:17","createUser":"1","updateUser":"1"}],"total":4,"size":2,"current":1,"orders":[],"optimizeCountSql":true,"hitCount":false,"countId":null,"maxLimit":null,"searchCount":true,"pages":2},"map":{!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--}}

二.禁/啟用員工賬號

在員工管理列表頁面,可以對某個員工賬號進行啟用或者禁用操作。賬號禁用的員工不能登錄系統(tǒng),啟用后的員工可以正常登錄,只有管理員(admin用戶)可以對其他普通用戶進行啟用、禁用操作,所以普通用戶登錄系統(tǒng)后啟用、禁用按鈕不顯示。

分析流程不難發(fā)現(xiàn),修改員工狀態(tài)是管理員的權(quán)限,對狀態(tài)的操作實際就是對employee表中的status字段進行update操作,在Controller層中我們需要編寫相關(guān)的方法來處理來自前端的這一請求,就像這樣:

@PutMapping

publicRStringupdate(HttpServletRequestrequest,@RequestBodyEmployeeemployee){

(employee.toString());

employee.setUpdateTime(LocalDateTime.now());

LongempID=(Long)request.getSession().getAttribute("employee");

employee.setUpdateUser(empID);

employeeService.updateById(employee);

returnR.success("員工信息修改成功");

Controller層中的update方法處理了請求,但是當(dāng)我再次刷新頁面發(fā)現(xiàn)其狀態(tài)并沒有改變!

通過Debug一步一步調(diào)試時,發(fā)現(xiàn)從Session里拿到的empID和數(shù)據(jù)庫里的字段id并不對應(yīng)分別是(15769348445792665611576934844579266600),而二者對應(yīng)起來才是能夠準確執(zhí)行update方法的關(guān)鍵

于是,進行排查,查看后端給頁面響應(yīng)的數(shù)據(jù)(response),發(fā)現(xiàn)與表中的id是對應(yīng)的,這說明后端沒問題

總的來說,后端傳給前端的id沒問題且與表中對應(yīng),但是前端返回給后端的id卻與之不一致了,問題出在哪?肯定是前端啊

原來啊我們傳提的是一個Long型的數(shù)值(19位),JS接收數(shù)據(jù)并進行處理后發(fā)生了精度丟失!JS只能精確處理前16位,后面的數(shù)字做了四舍五入處理

而把后端響應(yīng)的數(shù)值轉(zhuǎn)換成字符串即可避免這種現(xiàn)象,具體則是通過數(shù)值轉(zhuǎn)換器來實現(xiàn)!

三.數(shù)值轉(zhuǎn)換器的使用

提供對象轉(zhuǎn)換器JacksonobjectMapper,基于Jackson進行Java對象到j(luò)son數(shù)據(jù)的轉(zhuǎn)換,在此消息轉(zhuǎn)換器中使用提供的對象轉(zhuǎn)換器進行java對象到j(luò)son數(shù)據(jù)之間的相互轉(zhuǎn)換(序列化與反序列化)

publicclassJacksonObjectMapperextendsObjectMapper{

publicstaticfinalStringDEFAULT_DATE_FORMAT="yyyy-MM-dd";

publicstaticfinalStringDEFAULT_DATE_TIME_FORMAT="yyyy-MM-ddHH:mm:ss";

publicstaticfinalStringDEFAULT_TIME_FORMAT="HH:mm:ss";

publicJacksonObjectMapper(){

super();

//收到未知屬性時不報異常

this.configure(FAIL_ON_UNKNOWN_PROPERTIES,false);

//反序列化時,屬性不存在的兼容處理

this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

SimpleModulesimpleModule=newSimpleModule()

.addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))

.addDeserializer(LocalDate.class,newLocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))

.addDeserializer(LocalTime.class,newLocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

.addSerializer(BigInteger.class,ToStringSerializer.instance)

.addSerializer(Long.class,ToStringSerializer.instance)//將Long轉(zhuǎn)換成String

.addSerializer(LocalDateTime.class,newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))

.addSerializer(LocalDate.class,newLocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))

.addSerializer(LocalTime.class,newLocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

//注冊功能模塊例如,可以添加自定義序列化器和反序列化器

this.registerModule(simpleModule);

}

而我們要做的就是要把他寫到配置類里,擴展mvc框架的消息轉(zhuǎn)換器組件,用來將方法中返回的R對象結(jié)果轉(zhuǎn)換成字符串,以輸出流的方式返回給頁面

在配置類中確定好自己使用的轉(zhuǎn)換器類型并設(shè)置順序:

/**

*擴展mvc框架的消息轉(zhuǎn)換器組件

@Override

protectedvoidextendMessageConverters(ListHttpMessageConverterconverters){

//創(chuàng)建消息轉(zhuǎn)換器對象

MappingJackson2HttpMessageConvertermj2mc=newMappingJackson2HttpMessag

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論