mybatis-plus查詢無數(shù)據(jù)問題及解決
mybatis-plus查詢無數(shù)據(jù)
由于本周工作原因,spring系列放到下周寫,今天分享一個(gè)實(shí)際開發(fā)中出現(xiàn)的問題和解決辦法。
先說說背景
事情是這樣的,我們上線了一個(gè)繳費(fèi)系統(tǒng),但是一到高峰繳費(fèi),就會(huì)出現(xiàn)通過手機(jī)號(hào)查詢不到個(gè)人的繳費(fèi)信息。只要重啟,能好那么一下,然后隔一段時(shí)間,就又不行了。而且這塊還發(fā)現(xiàn)一點(diǎn)奇怪的規(guī)律,比如查詢某個(gè)號(hào)碼的,發(fā)現(xiàn)是點(diǎn)了9次之后,才會(huì)出現(xiàn),之后便會(huì)一直這樣。
使用的技術(shù)是springboot+spring mvc+mybatis-plus,數(shù)據(jù)庫(kù)是sqlserver(查的別人的庫(kù))
ps:由于事情過去一段時(shí)間了,當(dāng)時(shí)忘了截圖,這里可能是純文字描述,請(qǐng)見諒。
然后最開始根據(jù)經(jīng)驗(yàn)做了幾個(gè)判斷
1、是不是mybatis-plus的bug,連sqlserver有問題?
2、是不是mybatis-plus的緩存問題,從緩存中取數(shù)據(jù)取不到?
3、是不是并發(fā)太大,導(dǎo)致數(shù)據(jù)庫(kù)拒絕連接,或者連接超時(shí)了?
根據(jù)以上3點(diǎn)開始排查
1、debug mybatis源碼,發(fā)現(xiàn)沒問題,pass。
2、將緩存設(shè)置去掉,不啟用緩存,發(fā)現(xiàn)還會(huì)出問題,不是這個(gè)問題
3、如果是超時(shí),應(yīng)該是有日志,但是日志是沒有的,也不是這個(gè)問題,而且放到本地,調(diào)高并發(fā)量測(cè)試,也是沒有問題的。
來來回回搞了好久,都不行。最后沒辦法,把日志級(jí)別調(diào)到trace,開啟打印sql語句,看看是不是sql語句搞的鬼,果不其然,發(fā)現(xiàn)一些問題。
sql語句最開始是都正常的,但是當(dāng)查詢不到數(shù)據(jù)的時(shí)候,sql語句最后被拼接上了分頁(yè),而且查的10行到20行的數(shù)據(jù)(為什么剛好查詢的是10行到20行?最開始我提到了”比如查詢某個(gè)號(hào)碼的,發(fā)現(xiàn)是點(diǎn)了9次之后,才會(huì)出現(xiàn),之后便會(huì)一直這樣“),所以查不到。但是為啥點(diǎn)擊第2-8次的時(shí)候,不出現(xiàn),我也沒搞明白,有清楚的還請(qǐng)告知一下。
幾經(jīng)周折發(fā)現(xiàn),mybatis配置了這么一項(xiàng):

注意畫紅框地方,這個(gè)就是打開localpage模式。
supportMethodsArguments 這個(gè)值默認(rèn)是false,被設(shè)置了true,因此mybatis會(huì)自動(dòng)拼接自動(dòng)分頁(yè)。
把這個(gè)改成false或者直接去掉,就好了。完美解決。
當(dāng)然啦,大家一般都不會(huì)設(shè)置這個(gè)參數(shù),這里只是給大家做一個(gè)參考。
mybatis-plus查詢操作
一、查詢
1.1、普通查詢

/**
* 普通查詢
*/
@Test
public void selectById() {
User user = userMapper.selectById(1412963147760857089L);
System.out.println(user);
}查詢結(jié)果:

1.2、通過多個(gè)ID批量查詢

//多個(gè)id批量查詢
@Test
public void testSelectByIds(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1412963147760857089L,1413086639927959553L,1413087102014337026L));
System.out.println(users);
}查詢結(jié)果:

1.3、簡(jiǎn)單條件查詢

//簡(jiǎn)單條件查詢
@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é)果:

二、分頁(yè)
2.1、分頁(yè)插件
MyBatis Plus自帶分頁(yè)插件,只要簡(jiǎn)單的配置即可實(shí)現(xiàn)分頁(yè)功能。
2.2、添加分頁(yè)插件
配置類中添加@Bean配置:

/**
* 分頁(yè)查詢插件
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
2.3、測(cè)試selectPage分頁(yè)
通過page對(duì)象獲取相關(guān)數(shù)據(jù):
//分頁(yè)查詢
@Test
public void testSelectPage(){
Page<User> page = new Page(2,3);
Page<User> userPage = userMapper.selectPage(page, null);
//返回對(duì)象得到的分頁(yè)數(shù)據(jù)
long pages = userPage.getPages(); //總頁(yè)數(shù)
long current = userPage.getCurrent();//當(dāng)前頁(yè)
List<User> records = userPage.getRecords();//查詢到的分頁(yè)數(shù)據(jù)
long total = userPage.getTotal();//總記錄數(shù)
boolean hasNext = userPage.hasNext();//是否還存在上一分頁(yè)
boolean hasPrevious = userPage.hasPrevious();//是否還存在下一分頁(yè)
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、測(cè)試selectMapPage分頁(yè)
當(dāng)指定了特定的查詢列時(shí),希望分頁(yè)結(jié)果列表只返回被查詢的列,而不是很多null值。這時(shí)就可以測(cè)試selectMapsPage分頁(yè):結(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é)果:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
@RequestParam?和@RequestBody注解的區(qū)別解析
在 Spring MVC 中,我們可以使用 @RequestParam 和 @RequestBody 來獲取請(qǐng)求參數(shù),但它們?cè)谟梅ê妥饔蒙嫌幸恍﹨^(qū)別,這篇文章主要介紹了@RequestParam?和@RequestBody注解的區(qū)別,需要的朋友可以參考下2023-06-06
項(xiàng)目為什么引入log4j而不是logback代碼
這篇文章主要介紹了項(xiàng)目為什么引入log4j而不是logback代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
SpringBoot實(shí)現(xiàn)啟動(dòng)項(xiàng)目后立即執(zhí)行的方法總結(jié)
在項(xiàng)目開發(fā)中某些場(chǎng)景必須要用到啟動(dòng)項(xiàng)目后立即執(zhí)行方式的功能,所以這篇文章就來和大家聊聊實(shí)現(xiàn)立即執(zhí)行的幾種方法,希望對(duì)大家有所幫助2023-05-05
maven?插件?assembly?打tar.gz包的詳細(xì)過程
這篇文章主要介紹了maven插件assembly打tar.gz包的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
springBoot的事件機(jī)制GenericApplicationListener用法解析
這篇文章主要介紹了springBoot的事件機(jī)制GenericApplicationListener用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值的相關(guān)資料2019-09-09

