Mybatis-plus 分页集成以及基本使用总结 入门和案例 注解连表查询分页案例等

news2025/7/17 19:33:06

简介

Mybaits-plus 是mybits 的升级版,从mybaits 升级到mybaits-plus 可以实现平滑升级

Mybaits-plus 本身提供大量的基本查询方法以及强大的 Wrapper(包装) 类 用于查询的 QueryWrapper 以及 更新的 UpdateWrapper ,使用Wrapper 基本已经可以构建大部分条件了。

几乎可以实现很少代码,很多功能自动提供

使得一般的查询几乎不需要写 XML 直接使用代码包装完成。

同时支持各类注解帮助完成实体以及查询语句的构建。

环境

spring-boot

Maven 依赖

可以使用properties 的方式指定版本也可以去除perperties 直接写入版本到下面的 version 中

        <!-- 版本 -->
    <properties>
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
        <mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
    </properties>

        <!-- mybaits-plus 主要依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!-- MybatisPlus代码生成器  可选,不是必要的-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis-plus-generator.version}</version>
        </dependency>
        <!-- MybatisPlus代码生成器默认生成引擎的依赖 可选,不是必要的 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity.version}</version>
        </dependency>

使用分页时需要添加的配置类

注意下面的导包来源路径,不要导错

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    	// 新增mybatis-plus 插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 新增分页插件  并指定数据库类型
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setOptimizeJoin(true);
        // 查询分页最大限制 -1 时不做限制
        paginationInnerInterceptor.setMaxLimit(500L);
        // 加入分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

到这里基本完成配置

同时也可以在这里使用注解指出配置的实体类扫描路径和基本Mapper 类的路径
上面也可以如下示例:

@Configuration
// 指定实体类(就是和数据库中表对应的类)扫描路径  类所在包路径
@EntityScan("org.aurora.entity")
// 基本的Mapper 类的所在包路径
@MapperScan(basePackages = "org.aurora.mapper", markerInterface = BaseMapper.class)
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    	// 新增mybatis-plus 插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 新增分页插件  并指定数据库类型
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setOptimizeJoin(true);
        // 查询分页最大限制 -1 时不做限制
        paginationInnerInterceptor.setMaxLimit(500L);
        // 加入分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

包路径为多个同级目录下的多个mapper 时可以使用 ** 指代所有
例如:org.aurora.**.mapper
说明是 org.aurora 下所有的第一层同级包下,每个包下的 mapper 包下

例如我的测试用包路径如下
在这里插入图片描述
同时:上面的
@MapperScan 也可以加到 springboot的启动类上

如下
(注意:Application 启动类一定在 最外层,从图上可以看出和项目 resources 的层级关系,java 和 resources 同级,该类一定在一层包的最外面一层)
在这里插入图片描述
@MapperScan 也可以如下加入

@MapperScan("org.aurora.mapper")
// spring 中其他通过注解等方法注入spring容器的类的扫描路径 一般放到最大的路径上 让扫描整个项目也省事
@ComponentScan(value = {"org.aurora"})
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

@ComponentScan 中的路径最好放在最大的,这样 config 类也能扫描到,否则你可能会发现自己的部分类配置了但是不起作用。

上方 @EntityScan(“org.aurora.entity”) 也可以加入到 spring-boot 配置文件中 而不写在文件里
例如:
在spring-boot 的 application.properties 或者 applicaiton.yml 中如下:
两种文件仅仅是排版格式不同而已,值一致
mybatis-plus 配置中,这里是 yml 如下:

mybatis-plus:
# mybaits 和mybaits-plus 都可以使用的xml 文件类的扫描加载路径
  mapper-locations: classpath:mapper/*Mapper.xml
# 上面的 EntityScan 可以替代,也可以写在这里
  typeAliasesPackage: org.aurora.entity

properties类文件可以如下参考

# mybaits 和mybaits-plus 都可以使用的xml 文件类的扫描加载路径
mybatis-plus.mapper-locations = classpath:mapper/*Mapper.xml

# 上面的 EntityScan 可以替代,也可以写在这里
mybatis-plus.typeAliasesPackage= org.aurora.entity

mapper-locations:classpath: 后为路径,可以理解为这里扫描 resources 下一个叫 mapper 的文件加里面 所有以 Mapper为文件名后缀的 xml 文件。

一般实体类定义

(在上面定义的实体类扫描路径包下创建)
以下所有注解均来源于mybaits-plus 以及 lombok

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@TableName("t_person")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonEntity {

    @TableId(type = IdType.AUTO)
    private Long id;

    protected boolean flag;

    @TableField(value="create_time")
    protected Date createTime;

    @TableField(value = "person_name")
    private String personName;

    @TableField(value = "person_id")
    private String personId;

    @TableField(value = "person_pre")
    private String personPre;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
为lombok 注解用于简化 get set 以及构造方法等,可以使用一般的 get set 构建函数替代而不使用注解

@TableId
用于指定当前表的主键Id 如果自己设置了自增,不要忘了在建表时也设置主键自增否则会出现保存失败的情况

@TableName
指定当前表的表名

@TableField
指定当前属性在表中的字段名称
其中 flag 字段没有指定,可以认为单个单词时不用指定 table_field 默认使用属性名。

建立实体对应的Mapper 接口类 (dao 层)

(在上面指定的Mapper 扫描路径包下定义)

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.aurora.entity.PersonEntity;
import org.springframework.stereotype.Repository;

// 定义为持久层 数据库交互
@Repository
public interface PersonMapper extends BaseMapper<PersonEntity> {
    
}

是的 只需要这一点就可以了 这样 Mybaits 就提供了 PersonEntity 对应表的基本查询的所有方法,当然也可以像 mybatis 一样继续定义抽象方法,然后**在 resources 下的 mapper 包内添加对应 Mapper.xml 文件的SQL实现

Mapper 接口类的实际使用

在某一Service 中我可以如下定义

基本新增数据

import org.aurora.mapper.PersonMapper;
import org.aurora.entity.PersonEntity;
import org.aurora.service.PersonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@Slf4j
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonMapper personMapper;

    @Override
    public void test() {

        PersonEntity personEntity = new PersonEntity();
        personEntity.setFlag(true);
        personEntity.setCreateTime(new Date());
        personEntity.setPersonId("*************");
        personEntity.setPersonName("jack");
        personEntity.setPersonPre("king");

        personMapper.insert(personEntity);
    }
}

这是接口类 继承 BaseMapper<**Entity> 后提供的基本方法,只需要实体即可。
在这里插入图片描述

基本查询

继承 baseMapper 后即提供以下查询方法
在这里插入图片描述
selectByMap
入参为普通的 Map 其中 map 的key 需要放入实际表的字段名例如上面的(“person_name”), value 是某一个字段等于的值,相当于普通的条件查询。

selectCount
该方法为条件下计算总数
入参为 wrapper 类。wrapper 是mybaits-plus 的条件包装类,暂时可以当作Map 但是比 Map 更强大,提供了大于,等于,小于,like 等等,方法介绍完成后下面做具体说明。

selectList
查询满足某些条件的实体集合。

selectPage
查询满足某些条件的实体集合。同时支持分页,可以放入分页对象,自动完成分页查询。
分页下面与 wrapper 同时介绍

selectBatchIds
查询某一个id 集合下的所有实体。

selectById
通过主键查询

selectMaps
获取的结果转为 Map 的集合,可以用于单独几个字段或自定义结果查询。

selectMapsPage
与上面比多了分页而已

selectObjs
同样的返回自定义结果集合

selectOne
查询某些条件下唯一的实体

Wrapper 介绍 以及分页的基本使用

查询时使用 QueryWrapper
在这里插入图片描述
在这里插入图片描述
可以看的出wrapper 提供了很多包装功能,其中入参的 column 为列名Object 即为值condition当前语句加入实际查询语句的条件可以如下理解:

即最简单的我们某一个值不存在时某一句是不需要加入的,condition 就完成了整个封装过程减少了 if 的判断

eq: 相等
in: 一般的 in 条件
ge: 大于等于
gt: 大于
le: 小于等于
lt: 小于
between : 某一列 在某两个值之间
or: 或者

以及排序
在这里插入图片描述
like 模糊查询:
在这里插入图片描述
groupBy:
在这里插入图片描述
haveing:
在这里插入图片描述

一般的使用可以如下参考:

在这里插入图片描述

分页查询

示例:
注意Page的来源 也是mybatis-plus 不要用其他的,内部已经提供了总页数,总数,当前页,页容量,

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

@Service
@Slf4j
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonMapper personMapper;

    @Override
    public void test() {
        String personName = null;

        Page<PersonEntity> page = new Page<>();
        // 查询的当前页码  第一页
        page.setCurrent(1);
        // 查询条数
        page.setSize(10);

        QueryWrapper<PersonEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("flag", true);
        queryWrapper.eq(StringUtils.isNotEmpty(personName), "person_name", personName);
        queryWrapper.like("person_id", "4567");

        Page<PersonEntity> pageList = personMapper.selectPage(page, queryWrapper);
    }
}

在这里插入图片描述

更新时 updateWrapper

当使用更新时使用 updateWrapper
但与 queryWrapper 不同的是有 set 方法,即更新某一个字段的值
同样存在 condition 的用法,免去 if 的书写。
在这里插入图片描述
例如:
在这里插入图片描述
可以看的出可以直接将实体放入后自动通过Id 更新,也可以将wrapper 放入
经过尝试,第一个方法中的entity 可以不放入填写 null ,则会根据 wrapper 中的条件更新所有符合条件的数据。

删除

同样的删除也使用 updateWrapper
方法见名知意,都很简单。
在这里插入图片描述

到此所有的基本方法基本都可以无代码自动支持了!
不得不说,真的十分简化操作!

连表查询-连表分页 注解+sql实现

首先需要在 mapper 中额外定义抽象方法

下面第一个为分页,第二个为不分页

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

@Repository
public interface XxxxxMapper  extends BaseMapper<XxxxxEntity> {

    @Select("SELECT r.id, r.dept_id, r.person_id," +
            "s.secret_name, t.state, f.error  FROM t_person AS r "
            + " LEFT JOIN t_secret AS s ON r.id = s.per_id "
            + " LEFT JOIN t_xxxx AS f ON r.id = f.id "
            + " LEFT JOIN t_xxxxxxxx AS t ON f.flow_id = t.id "
            + " ${ew.customSqlSegment}")
    IPage<XxxxxxDTO> getListPageByConditions(IPage<XxxxxxDTO> pageDtoIPage, @Param("ew") Wrapper wrapper);

    @Select("SELECT r.id, r.dept_id, r.person_id," +
            "s.secret_name, t.state, f.error  FROM t_person AS r "
            + " LEFT JOIN t_secret AS s ON r.id = s.per_id "
            + " LEFT JOIN t_xxxx AS f ON r.id = f.id "
            + " LEFT JOIN t_xxxxxxxx AS t ON f.flow_id = t.id "
            + " ${ew.customSqlSegment}")
    XxxxxxDTO getListByConditions(@Param("ew") Wrapper wrapper);
}

解读
第一个方法 getListPageByConditions 的分页方法需要我们将 mybatis-plus 的分页对象作为入参传入,外面调用时记得指定分页的当前页码以及页容量

其他的条件可以通过 queryWrapper 对象传入。
ew.customSqlSegment: ew 为别名 用于识别wrapper 对象,customSqlSegment 为queryWrapper 中的 方法
在这里插入图片描述
customSqlSegment 应该是用于获取queryWrapper 构建完成的 SQL 语句,所以在实际queryWrapper 时指定的列名也要用 表别名之类的指定才行
类似于:
在这里插入图片描述
这里查询出的字段名可以和对应实体定义的属性名一致即可,最终返回时会自动匹配列名。

例如上面查询了 secret_name 但是实体中我定义的是这样

    @TableField(value = "secret_name")
    private String secretName;

那么返回的自定义类中也使用 secretName 即可。

其他内容后续不定期继续加入,都在同一专题下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记忆总掉线?这些行为太伤脑!

人体老化过程中&#xff0c;记忆力的衰退不可避免&#xff0c;这种属于“良性”的记忆衰退。但非“良性”的记忆衰退可要重视&#xff0c;很可能是痴呆症的早期征兆。由于各种原因&#xff0c;我们各种熬夜。作息的不规律扰乱大脑神经系统的调节。这种长期慢性损害大脑&#xf…

ur3+robotiq 2f 140配置moveit

ur3robotiq 2f 140配置moveit 参考链接1 参考链接2 官方配置movit教程 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪…

人工智能AI威武,爱也……恨也……

人工智能AI威武&#xff0c;爱也&#xff01;恨也&#xff01;&#xff01;它会创作会代码&#xff0c;从它那儿能仿到更好的思维&#xff1b;多它那里可以学到更好的代码。它聪慧全能&#xff0c;成为一坨人偷懒神器&#xff1b;变成“智者”作弊的“倚天屠龙”&#xff01;&a…

易基因|DNA甲基化研究的测序数据挖掘思路:干货分享

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。总体来说&#xff0c;DNA甲基化一般遵循三个步骤进行数据挖掘。首先&#xff0c;进行整体全基因组甲基化变化的分析&#xff0c;包括平均甲基化水平变化、甲基化水平分布变化、降维分析、聚…

Wsl2 ubuntu 配置git 阿里云codeup

目录 创建一个跟你windows git使用相同的用户名,特别重要 配置git 用户名和邮箱 配置阿里云codeup 拉取仓库提示文件权限问题 给用户目录权限 配置项目文件别名 key_load_public: invalid format 怎么办&#xff1f; WSL ubuntu sshd: no hostkeys available -- exiting…

初始C++

写在前面 这是我第一次接触到C,之前对它的大名可谓是如雷贯耳.这两天有人问我学习C的感觉怎么样?对此我想说,很难.C的细节很多,要求我们比学习C语言更加细心,我不是没有学习过OOP语言,但是刚开始接触到还是感觉有点吃力,不过这是一种很令人高兴的情况,这代表你在进步,要是我们…

QT MySQL 连接出错报 QSqlDatabase: QMYSQL driver not loaded

QT连接MySQL失败&#xff08;本人QT版本&#xff1a;5.12.5&#xff09;一、报错结果QSqlDatabase: QMYSQL driver not loadedQSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7二、报错原因缺少MySQL驱动&#xff08;qsqlmysql.dll&#xff0c;qsqlmysql.d…

Salesforce大揭秘!SaaS鼻祖不为人知的那些事!

Salesforce的世界无疑是广阔的。自从创始人Marc Benioff于1999年创立公司以来&#xff0c;Salesforce一直在打破CRM领域的界限&#xff0c;改变销售、营销和技术的格局。 作为全球领先的B2B科技公司之一&#xff0c;Salesforce和硅谷里的其他企业一样&#xff0c;缔造着一个关…

Python入门之最基础

Python入门之最基础 IDLE有两种模式&#xff0c;一种是交互模式&#xff0c;通俗讲就是写一个代码&#xff0c;会得到相应的反馈&#xff0c;另一种为编辑模式. 注意事项&#xff1a; 标点符号一定要用英文符号 要注意缩进 dir(builtins)可以看到python所有的内置函数&#…

P6软件核心CPM关键路径

卷首语 由于单代号网络图能体现更丰富的活动逻辑关系&#xff0c;目前关键路径法的应用更倾向于使用单代号网络图。 关键路径法 关键路径法&#xff0c;又称关键路径分析&#xff0c;是网络计划技术的一种&#xff0c;通过其蕴含的算法安排项目活动的开展。关键路径法将项目…

Java Object的hashCode方法及其重写应用

本文参考&#xff1a; Object中的hashCode()终于搞懂了&#xff01;&#xff01;&#xff01;_马走日mazouri的博客-CSDN博客_object hashcode Java加密&#xff1a;常见哈希算法总结_m.j.y.的博客-CSDN博客 Java Object类中的hashCode方法_qq_18974899的博客-CSDN博客_object类…

Java行转列通用工具类适用于各种查询情况

1、说明 有时候工作中需要动态生成列&#xff0c;也就是不确定的列&#xff0c;那么在数据库层就不是那么好操作了&#xff0c;可以使用java工具类来实现。 本工具类是对市面上的工具类进行加工改造&#xff0c;可以通用于各种情况&#xff0c;更加灵活&#xff0c;下面我来演…

GitHub

什么是 Github?GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行托管&#xff0c;故名GitHub。一、常用词Watch&#xff1a;观察。如果watch了一个项目&#xff0c;之后这个项目有更新&#xff0c;你会在第一时间收到该项目更…

pytorch1.2.0+python3.6

一、说明 pytorch1.2.0python3.6CUDA10.0cudnn7.4.1.5 二、步骤 在conda中创建一个新的虚拟环境 查看一下自己的所有环境 激活虚拟环境 conda activate torch1.2.0 关于cuda和cudnn 1、查看自己电脑系统是10.2版本 http://链接&#xff1a;https://pan.baidu.com/s/1v5cN6…

Vivado_FIR滤波器输出位宽计算方法

计算方法 全精度输出宽度可以定义为输入数据宽度加上由滤波器系数导致的位增长数。 最坏情况下的位增长等于系数宽度加上所需非零乘法次数的以2为底的对数并四舍五入后的值。然而&#xff0c;这没有考虑实际系数值。计算公式如下。 BCWceil⁡[log⁡2N]BC_{W}\operatorname{cei…

滑台模组的应用有哪些?

在自动化生产中&#xff0c;我们常常会看到滑台模组的身影&#xff0c;那么&#xff0c;滑台模组究竟在自动化生产设备中起着怎样的作用呢&#xff1f; 简单点说&#xff0c;滑台模组由滑块、滚珠丝杆、导轨、主体等其它传动零件组成的自动化晋级单元&#xff0c;经过各单元的组…

储物流行业解决方案

行业分析 第三方物流仓储物流的日常管理控制活动主要包括进,出&#xff0c;存三个方面。在没有实现计算机化管理的商业企业中&#xff0c;大量的业务操作和管理活动由人工来完成。在管理层中&#xff0c;由于大量必要的信息不能及时被采集﹑加工和整理使用&#xff0c;造成了极…

想成为一名专业黑客,但不知道从哪里学起?我来教你。

成为一名黑客需要学什么&#xff1f; 想成为一名专业黑客&#xff0c;但不知道从哪里学起”很多人在后台问过这个问题&#xff0c;今天就为你介绍成为专业黑客必须学习的十个方面的知识&#xff0c;希望能为迷惘中的你指明方向。 想要成为网络hacker黑客&#xff1f;先来学习…

未来土地利用模拟FLUS模型

未来土地利用模拟&#xff08;FutureLand-Use Simulation, FLUS&#xff09;模型1 模型简介1.1 基于ANN 的适宜性概率计算1.2 基于自适应惯性机制的元胞自动机1.3 模拟精度评价参考流域 径流变化是 自然因素和 人为因素共同作用的结果&#xff0c;其中人为因素最为直接的方式就…

SpringMVC框架知识详解(入门版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…