mybatis-plus查詢無數(shù)據(jù)問題及解決
mybatis-plus查詢無數(shù)據(jù)
由于本周工作原因,spring系列放到下周寫,今天分享一個實際開發(fā)中出現(xiàn)的問題和解決辦法。
先說說背景
事情是這樣的,我們上線了一個繳費系統(tǒng),但是一到高峰繳費,就會出現(xiàn)通過手機號查詢不到個人的繳費信息。只要重啟,能好那么一下,然后隔一段時間,就又不行了。而且這塊還發(fā)現(xiàn)一點奇怪的規(guī)律,比如查詢某個號碼的,發(fā)現(xiàn)是點了9次之后,才會出現(xiàn),之后便會一直這樣。
使用的技術(shù)是springboot+spring mvc+mybatis-plus,數(shù)據(jù)庫是sqlserver(查的別人的庫)
ps:由于事情過去一段時間了,當時忘了截圖,這里可能是純文字描述,請見諒。
然后最開始根據(jù)經(jīng)驗做了幾個判斷
1、是不是mybatis-plus的bug,連sqlserver有問題?
2、是不是mybatis-plus的緩存問題,從緩存中取數(shù)據(jù)取不到?
3、是不是并發(fā)太大,導致數(shù)據(jù)庫拒絕連接,或者連接超時了?
根據(jù)以上3點開始排查
1、debug mybatis源碼,發(fā)現(xiàn)沒問題,pass。
2、將緩存設(shè)置去掉,不啟用緩存,發(fā)現(xiàn)還會出問題,不是這個問題
3、如果是超時,應該是有日志,但是日志是沒有的,也不是這個問題,而且放到本地,調(diào)高并發(fā)量測試,也是沒有問題的。
來來回回搞了好久,都不行。最后沒辦法,把日志級別調(diào)到trace,開啟打印sql語句,看看是不是sql語句搞的鬼,果不其然,發(fā)現(xiàn)一些問題。
sql語句最開始是都正常的,但是當查詢不到數(shù)據(jù)的時候,sql語句最后被拼接上了分頁,而且查的10行到20行的數(shù)據(jù)(為什么剛好查詢的是10行到20行?最開始我提到了”比如查詢某個號碼的,發(fā)現(xiàn)是點了9次之后,才會出現(xiàn),之后便會一直這樣“),所以查不到。但是為啥點擊第2-8次的時候,不出現(xiàn),我也沒搞明白,有清楚的還請告知一下。
幾經(jīng)周折發(fā)現(xiàn),mybatis配置了這么一項:
注意畫紅框地方,這個就是打開localpage模式。
supportMethodsArguments 這個值默認是false,被設(shè)置了true,因此mybatis會自動拼接自動分頁。
把這個改成false或者直接去掉,就好了。完美解決。
當然啦,大家一般都不會設(shè)置這個參數(shù),這里只是給大家做一個參考。
mybatis-plus查詢操作
一、查詢
1.1、普通查詢
/** * 普通查詢 */ @Test public void selectById() { User user = userMapper.selectById(1412963147760857089L); System.out.println(user); }
查詢結(jié)果:
1.2、通過多個ID批量查詢
//多個id批量查詢 @Test public void testSelectByIds(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1412963147760857089L,1413086639927959553L,1413087102014337026L)); System.out.println(users); }
查詢結(jié)果:
1.3、簡單條件查詢
//簡單條件查詢 @Test public void selectSimpleTerm(){ Map<String,Object> columnMap = new HashMap<>(); columnMap.put("name","lucyYY"); columnMap.put("age",20); List<User> users = userMapper.selectByMap(columnMap); System.out.println(users); }
查詢結(jié)果:
二、分頁
2.1、分頁插件
MyBatis Plus自帶分頁插件,只要簡單的配置即可實現(xiàn)分頁功能。
2.2、添加分頁插件
配置類中添加@Bean配置:
/** * 分頁查詢插件 */ @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); }
2.3、測試selectPage分頁
通過page對象獲取相關(guān)數(shù)據(jù):
//分頁查詢 @Test public void testSelectPage(){ Page<User> page = new Page(2,3); Page<User> userPage = userMapper.selectPage(page, null); //返回對象得到的分頁數(shù)據(jù) long pages = userPage.getPages(); //總頁數(shù) long current = userPage.getCurrent();//當前頁 List<User> records = userPage.getRecords();//查詢到的分頁數(shù)據(jù) long total = userPage.getTotal();//總記錄數(shù) boolean hasNext = userPage.hasNext();//是否還存在上一分頁 boolean hasPrevious = userPage.hasPrevious();//是否還存在下一分頁 System.out.println(pages); System.out.println(current); System.out.println(records); System.out.println(total); System.out.println(hasNext); System.out.println(hasPrevious); }
查詢結(jié)果:
2.4、測試selectMapPage分頁
當指定了特定的查詢列時,希望分頁結(jié)果列表只返回被查詢的列,而不是很多null值。這時就可以測試selectMapsPage分頁:結(jié)果集是Map。
//根據(jù)特定條件查詢結(jié)果 @Test public void testSelectMapPage(){ Page<Map<String,Object>> page = new Page<>(1,5); Page<Map<String,Object>> pageParam = userMapper.selectMapsPage(page,null); List<Map<String,Object>> records = pageParam.getRecords(); records.forEach(System.out::println); System.out.println(pageParam.getCurrent()); System.out.println(pageParam.getPages()); System.out.println(pageParam.getSize()); System.out.println(pageParam.getTotal()); System.out.println(pageParam.hasNext()); System.out.println(pageParam.hasPrevious()); }
查詢結(jié)果:
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java運行時環(huán)境之ClassLoader類加載機制詳解
這篇文章主要給大家介紹了關(guān)于Java運行時環(huán)境之ClassLoader類加載機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01java并發(fā)編程專題(一)----線程基礎(chǔ)知識
這篇文章主要介紹了java并發(fā)編程線程的基礎(chǔ)知識,文中講解非常詳細,幫助大家更好的學習JAVA并發(fā)編程,感興趣想學習JAVA的可以了解下2020-06-06Java中綴表達式轉(zhuǎn)后綴表達式實現(xiàn)方法詳解
這篇文章主要介紹了Java中綴表達式轉(zhuǎn)后綴表達式實現(xiàn)方法,結(jié)合實例形式分析了Java中綴表達式轉(zhuǎn)換成后綴表達式的相關(guān)算法原理與具體實現(xiàn)技巧,需要的朋友可以參考下2019-03-03SpringBoot使用@Validated處理校驗的方法步驟
@Validated?注解的主要目的是啟用和利用?Spring?的驗證框架,它可以用于類上也可以用于方法參數(shù)上,本文給大家介紹了SpringBoot使用@Validated優(yōu)雅的處理校驗的方法步驟,通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-08-08