mybatis-plus查询无数据问题及解决

 更新时间:2022年12月06日 09:04:20   作者:阳光coding  
这篇文章主要介绍了mybatis-plus查询无数据问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis-plus查询无数据

由于本周工作原因,spring系列放到下周写,今天分享一个实际开发中出现的问题和解决办法。

先说说背景

事情是这样的,我们上线了一个缴费系统,但是一到高峰缴费,就会出现通过手机号查询不到个人的缴费信息。只要重启,能好那么一下,然后隔一段时间,就又不行了。而且这块还发现一点奇怪的规律,比如查询某个号码的,发现是点了9次之后,才会出现,之后便会一直这样。

使用的技术是springboot+spring mvc+mybatis-plus,数据库是sqlserver(查的别人的库)

ps:由于事情过去一段时间了,当时忘了截图,这里可能是纯文字描述,请见谅。

然后最开始根据经验做了几个判断

1、是不是mybatis-plus的bug,连sqlserver有问题?

2、是不是mybatis-plus的缓存问题,从缓存中取数据取不到?

3、是不是并发太大,导致数据库拒绝连接,或者连接超时了?

根据以上3点开始排查 

1、debug mybatis源码,发现没问题,pass。

2、将缓存设置去掉,不启用缓存,发现还会出问题,不是这个问题

3、如果是超时,应该是有日志,但是日志是没有的,也不是这个问题,而且放到本地,调高并发量测试,也是没有问题的。

来来回回搞了好久,都不行。最后没办法,把日志级别调到trace,开启打印sql语句,看看是不是sql语句搞的鬼,果不其然,发现一些问题。

sql语句最开始是都正常的,但是当查询不到数据的时候,sql语句最后被拼接上了分页,而且查的10行到20行的数据(为什么刚好查询的是10行到20行?最开始我提到了”比如查询某个号码的,发现是点了9次之后,才会出现,之后便会一直这样“),所以查不到。但是为啥点击第2-8次的时候,不出现,我也没搞明白,有清楚的还请告知一下。

几经周折发现,mybatis配置了这么一项:

注意画红框地方,这个就是打开localpage模式。

supportMethodsArguments 这个值默认是false,被设置了true,因此mybatis会自动拼接自动分页。

把这个改成false或者直接去掉,就好了。完美解决。

当然啦,大家一般都不会设置这个参数,这里只是给大家做一个参考。

mybatis-plus查询操作

一、查询

1.1、普通查询

    /**
     * 普通查询
     */
    @Test
    public void selectById() {
        User user = userMapper.selectById(1412963147760857089L);
        System.out.println(user);
    }

查询结果:

1.2、通过多个ID批量查询

   //多个id批量查询
    @Test
    public void testSelectByIds(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1412963147760857089L,1413086639927959553L,1413087102014337026L));
        System.out.println(users);
    }

查询结果

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);
    }

查询结果

二、分页

2.1、分页插件

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。

2.2、添加分页插件

配置类中添加@Bean配置:

    /**
     * 分页查询插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }

2.3、测试selectPage分页

通过page对象获取相关数据:

    //分页查询
    @Test
    public void testSelectPage(){
        Page<User> page = new Page(2,3);
        Page<User> userPage = userMapper.selectPage(page, null);
        //返回对象得到的分页数据
        long pages = userPage.getPages(); //总页数
        long current = userPage.getCurrent();//当前页
        List<User> records = userPage.getRecords();//查询到的分页数据
        long total = userPage.getTotal();//总记录数
        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);
    }

查询结果

2.4、测试selectMapPage分页

当指定了特定的查询列时,希望分页结果列表只返回被查询的列,而不是很多null值。这时就可以测试selectMapsPage分页:结果集是Map。

    //根据特定条件查询结果
    @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());
    }

查询结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Bean的包扫描的实现方法

    Spring Bean的包扫描的实现方法

    这篇文章主要介绍了Spring Bean的包扫描的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详细学习Java Cookie技术(用户登录、浏览、访问权限)

    详细学习Java Cookie技术(用户登录、浏览、访问权限)

    这篇文章主要为大家详细介绍了Java Cookie技术,显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放)等,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Java中检查字符串是否以特定字符结尾

    Java中检查字符串是否以特定字符结尾

    这篇文章主要介绍了Java中检查字符串是否以特定字符结尾,文章围绕主题展开字符串匹配问题,具有一定的参考价值需要的小伙伴可以参考一下
    2022-06-06
  • Spring 零基础入门WebFlux框架体系

    Spring 零基础入门WebFlux框架体系

    Spring5发布有两年了,随Spring5一起发布了一个和Spring WebMvc同级的Spring WebFlux。这是一个支持反应式编程模型的新框架体系。反应式模型区别于传统的MVC最大的不同是异步的、事件驱动的、非阻塞的,这使得应用程序的并发性能会大大提高,单位时间能够处理更多的请求
    2022-07-07
  • Java设计模式常用的七大原则总结

    Java设计模式常用的七大原则总结

    今天给大家总结了Java设计模式的七大原则,主要有单一职责原则,接口隔离原则,依赖倒转原则,里氏替换原则等,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • JAVA集合框架Map特性及实例解析

    JAVA集合框架Map特性及实例解析

    这篇文章主要介绍了JAVA集合框架Map特性及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • JavaWeb项目音频资源播放实现方法详解

    JavaWeb项目音频资源播放实现方法详解

    这篇文章主要介绍了JavaWeb项目音频资源播放实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java源码解析之接口Collection

    Java源码解析之接口Collection

    Collection是List、Queue和set的超集,它直接继承于Iterable,也就是说所有的Collection集合类都支持foreach循环.除此之外呢,Collection也是面向接口编程的典范,它可以在多种实现类间转换,这就是面向对象编程的厉害之处.接下来就随着小编一起去看看吧,需要的朋友可以参考下
    2021-05-05
  • 详解SpringCloud Config配置中心

    详解SpringCloud Config配置中心

    这篇文章主要介绍了详解SpringCloud Config配置中心,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法

    导入项目出现Java多个工程相互引用异常A cycle was detected in the build path o

    今天小编就为大家分享一篇关于导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论