MybatisPlus只取一条记录的两种方法实现

 更新时间:2025年07月29日 10:10:00   作者:杰肥啊  
本文介绍了MyBatis-Plus2.x和3.x版本在IService接口获取单条记录的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

不管是用MP2.X版本的还是MP3.X版本的小伙伴都会发现,在其IService接口中 并没有一个可以直接获取一条记录的方法。

MP2.x提供selectOne方法

@Override
public T selectOne(Wrapper<T> wrapper){
    return SqlHelper.getObject(baseMapper.selectList(wrapper));
}

查询多条记录,如果存在则返回List.get(0)位置上的数据。

MP3.x提供getOne方法

T getOne(Wrapper<T> queryWrapper,boolean throwEx){
    return throwEx?this.baseMapper.selectOne(queryWrapper):SqlHelper.getObject(this.log,this.baseMapper.selectList(queryWrapper));
}

getOne方法只不过是在2.x的selectOne方法上多了一个布尔值,意思就是如果为true,则就是查询多条记录就会抛异常,如果为false,则查询多条记录后,取get(0)第一个位置记录返回。

不难看出,不管是selectOne还是getOne 底层调用的是selectList,有些人会说了,正常情况下,自己调用selectOne的数据,基本也是唯一。 但是在有些情况下,通过selectOne调用再由selectList的一些sql获取到的结果其实是多条甚至是成百上千条(有时候真的会遇到),可是你只会看到第一条数据。虽然说业务上并不会影响你们,但是你想过没有,如果稍有不慎你的sql查询的结果在数据库里是10000条,而这个查询经常被调用,也就是说10000条数据返回被加载在内存,然后就给了你一条,你是爽了,服务器有负担了。所以我们需要一个在sql语句阶段就能限制查询一条的结果的东西,那毋庸置疑就是LIMIT 1,那如何使用LIMIT 1 有以下两种常用写法。

第一种写法

mapper.xml中写一个关于本次查询的sql ,尾部加上 limit 1

SELECT 
	colum1,colum2,colum3 
FROM 
	table1 
WHERE 
	条件 
LIMIT 1

这种写法有一个不好的地方在哪里呢,对于单表查询来说的话,不友善,几乎你条件一变,要么你用if标签,要么你就得再写一次sql语句。反正个人就觉得挺丑的。

第二种写法

在MP提供的 Wrapper接口的实现类中都存在一个 last方法 用来最后拼接一个sql片段,在这里我们加一个limit 1。

public Children last(boolean condition, String lastSql) {
        if (condition) {
            this.lastSql.setStringValue(" " + lastSql);
        }

        return this.typedThis;
}

日常开发的时候基本就这么写

2.x写法

xxService.selectOne(new EntityWrapper().eq().eq().last("limit 1"));

3.x写法

xxService.selectOne(new QueryWrapper().eq().eq().last("limit 1"));

但是这也有一个挺恶心人的地方,就是这last放这 加上 limit 1 还是魔法值,挺难看的。所以可以变成以下封装。

你创建Service接口的时候一定会集成MP中的IService接口,所以就在这里利用java 8的新特性(接口的默认实现方法)来完成封装.

这里的xxx指的是你业务中的某个实体类,懂的都懂。

2.x写法

public interface xxxService extends IService<xxx>{
    /**
     * 仅有一条数据
     * @param wrapper
     * @return
     */
    default xxx getOnly(EntityWrapper<xxx> wrapper){
        wrapper.last("limit 1");
        return this.selectOne(wrapper);
    };
}

3.x写法

public interface xxxService extends IService<xxx>{
    /**
     * 仅有一条数据
     * @param wrapper
     * @return
     */
    default xxx getOnly(QueryWrapper<xxx> wrapper){
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    };
}

这样,你就可以将代码中的selectOne方法 无缝替换了。

到此这篇关于MybatisPlus如何只取一条记录的文章就介绍到这了,更多相关MybatisPlus只取一条记录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中import static使用方式小结

    Java中import static使用方式小结

    import static是Java中用于导入静态成员的特性,可以直接导入静态方法、常量、内部类和枚举成员,本文就来介绍一下Java中import static使用,感兴趣的可以了解一下
    2025-08-08
  • SpringBoot解决循环调用问题

    SpringBoot解决循环调用问题

    作者在将SpringBoot从1.5版本升级至2.6版本,并迁移至阿里云上运行后,遇到了循环调用问题,在Jetty容器中运行没问题,但在Tomcat容器中就出现了循环引用问题,原因是SpringBoot 2.6不鼓励循环引用,暴露出该问题,作者提供了两种解决思路
    2024-10-10
  • Spring状态机的使用解读

    Spring状态机的使用解读

    本文详细介绍了Spring状态机的基本概念、核心组件以及在生产环境中的应用,通过订单系统和审批工作流系统的例子,展示了状态机如何简化状态流转处理,此外,还介绍了状态监听器、Guards、可视化、分布式状态一致性、性能优化等技巧,并总结了Spring状态机的优势
    2026-01-01
  • mybatis中bind标签和concat的使用说明

    mybatis中bind标签和concat的使用说明

    这篇文章主要介绍了mybatis中bind标签和concat的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • springboot项目实现断点续传功能

    springboot项目实现断点续传功能

    这篇文章主要介绍了springboot项目实现断点续传,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java的HashSet源码详解

    Java的HashSet源码详解

    这篇文章主要介绍了Java的HashSet源码详解,HashSet底层封装的是HashMap,所以元素添加会放到HashMap的key中,value值使用new Object对象作为value,所以HashSet和HashMap的所具有的特点是类似的,需要的朋友可以参考下
    2023-09-09
  • 解决JdbcTemplate查询时报错Incorrect column count: expected 1, actual 17问题

    解决JdbcTemplate查询时报错Incorrect column count: ex

    文章描述了在使用JdbcTemplate执行查询时遇到的`IncorrectResultSetColumnCountException`错误,原因是`queryForList`方法返回的是`List<Map<String, Object>>`类型,不能直接转换成对象,解决方法是将代码修改为适当的查询方式,以避免错误
    2026-01-01
  • Spring中的@ExceptionHandler注解详解与应用示例

    Spring中的@ExceptionHandler注解详解与应用示例

    本文详细介绍了Spring框架中的@ExceptionHandler注解的用法,包括基本用法、全局异常处理、结合@ResponseStatus注解以及返回值类型,通过示例展示了如何使用@ExceptionHandler注解处理不同类型的异常,并提供定制化的异常处理响应,需要的朋友可以参考下
    2024-11-11
  • Java ArrayList底层方法的实现深度解析

    Java ArrayList底层方法的实现深度解析

    ArrayList是Java集合框架中List接口的动态数组实现,可以方便的存储和操作数据,这篇文章是进行ArrayList的一个自我实现,让我们从底层更深度地理解ArrayList(顺序表),感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Java虚拟机调用Java主类的main()方法

    Java虚拟机调用Java主类的main()方法

    这篇文章主要介绍了Java虚拟机调用Java主类的main()方法,前一篇文章我们介绍了关于Java虚拟机HotSpot
    2021-11-11

最新评论