欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

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

2025年08月28日 Java
不管是用mp2.x版本的还是mp3.x版本的小伙伴都会发现,在其iservice接口中 并没有一个可以直接获取一条记录的方法。mp2.x提供selectone方法@overridepublic t s

不管是用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只取一条记录内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!