MybatisPlus基本使用(MP快速上手)

这篇具有很好参考价值的文章主要介绍了MybatisPlus基本使用(MP快速上手)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

概述

MP快速上手(基本操作)

 SpringBoot中MyBatisPlus环境搭建

增删改查

分页

条件查询(聚合,模糊,匹配范围)

条件:范围匹配 (大于小于等于...)

优化查询条件书写()

条件:查询投影

条件:模糊查询(非全文检索)

 条件:聚合函数和分组

条件:排序操作        

条件判断(条件为null时情况处理)

字段映射和表名映射

id生成策略

​编辑

多数据操作


概述

MyBatisplus(简称MP)是基于MyBatis框架基础上开发的增强型工具。

作用:简化开发,提高效率。 

MP核心:为简化开发而生。

MP由国人开发,在 Mybatis 的基础上只做增强不做改变,MP中内置了一些常用访问数据库数据的方法,例如CRUD方法等,我们不需要声明就直接可以使用。


MP快速上手(基本操作)

 下面就使用Spring-Boot工程作为基本来介绍MP的使用。如下的介绍中,只针对数据层进行使用测试,并不涉及业务层和表现层。

 SpringBoot中MyBatisPlus环境搭建

,在SpringBoot中配置MP环境很简单,只需要导入MP的起步依赖,配置数据源,完善数据表和pojo类,设置数据层接口,然后调用即可。

一、创建Boot工程,导入MP依赖

说明:

1.使用正统方式创建(start.spring.io),在选择起步依赖时,并没有MyBatisPlus的选项,没有关系,直接创建,创建好之后再导入依赖即可。

2.使用阿里云(start.aliyun.com)创建boot工程,就会存在MP的起步依赖,直接选择即可。

 官方方式创建boot工程起步依赖选择

MybatisPlus基本使用(MP快速上手)

阿里云方式创建boot工程起步依赖选择

MybatisPlus基本使用(MP快速上手)

 使用官方方式创建后,手动导入MP起步依赖:

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.2</version>
</dependency>

二、配置数据源

在此使用druid的数据源,使用druid的起步依赖后可以进行如下方式书写。方式不用一致,配置好数据源信息即可。

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test
      username: root
      password: root

三、准备测试数据表和实体类

在此使用test数据库下的account表,表字段和数据信息如下:

MybatisPlus基本使用(MP快速上手)

 书写与之对应的实体类

说明: 在此使用lombok配置实体类,lombok为快速开发实体类的工具,只需要加几个注解就可以实现实体类的get、set、toString等方法,想要使用,需要导入依赖坐标即可。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    private int id;
    private String name;
    private double balance;
}

lombok坐标

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.22</version>
</dependency>

四、设置数据层接口

@Mapper
public interface AccountDAO extends BaseMapper<Account> {
}

至此,MP环境就搭建好了,因为MP内置了许多常用的方法,所有我们直接就可以测试了。 

 工程结构:

MybatisPlus基本使用(MP快速上手)

 五、测试,通过下面的基本使用进行测试。


增删改查

做完上述的准备工作,把MP的环境搭建好以后,就可以开始使用MP了。先从最基本的CRUD开始:测试在测试类下进行(只使用数据层做测试)。

MybatisPlus基本使用(MP快速上手)

 基本CURD操作


//自动装配数据层接口
@Autowired
private AccountDAO accountDAO;

//增添数据
@Test
void insertTest(){
	Account account = new Account(7, "Mh", 6000);
	accountDAO.insert(account);
}

//删除数据
@Test
void deleteTest(){
	accountDAO.deleteById(7);
}

//修改数据
@Test
void updateTest(){
	Account account = new Account(6, "MH", 6000);
	accountDAO.updateById(account);
}

//根据ID查询单个信息
@Test
void selectTest() {
	Account account = accountDAO.selectById(1);
	System.out.println(account);
}
//获取表中所有数据
@Test
void selecAlltTest() {
    //selectList参数为null,代表没有查询条件
	List<Account> accounts = accountDAO.selectList(null);
	accounts.forEach(System.out::println);
	
}

分页

分页操作MP内部也有实现,不过并不像上面的CRUD这样简单,我们需要去做一些配置。

MP实现分页查询步骤:

1.需要先添加拦截器-分页拦截器
2.创建IPage实现类,构造器初始化Page
3.IPage调用方法,获取数据信息

实现:

1.创建MP拦截器类,添加分页内置拦截器。

@Configuration
public class MPConfig {

    @Bean
    public MybatisPlusInterceptor getInterceptor(){
		//创建MP拦截器
        MybatisPlusInterceptor MPInterceptor = new MybatisPlusInterceptor();
		//添加分页拦截器
        MPInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
		//将设置好的拦截器返回
        return MPInterceptor;
    }

}

2.创建并初始化IPage实现类,实现分页查询

@Test
void selectPageTest(){
    //创建IPage实现类,参数为(当前页数,每页记录数)
	IPage page = new Page(1,2);
    //参数null为条件-无条件查询
	accountDAO.selectPage(page,null);
	page.getPages(); // 获取总页数
	page.getCurrent(); // 获取当前页数
	page.getRecords(); // 获取记录(数据)
	page.getSize(); // 获取每页记录数
	page.getTotal(); // 获取记录总数
    //将想要得到的信息输出即可
}

条件查询(聚合,模糊,匹配范围)

条件:范围匹配 (大于小于等于...)

在上述的操作中,例如selectList,selectPage等,都有一个参数我们设置为null,如果不设置为null,那这个条件参数我们要怎么设置呢?如下说明:

MybatisPlus基本使用(MP快速上手)

 拿selectList举例,可以看到条件参数的类型为queryWrapper,那么我们就创建一个queryWrapper对象看看。

QueryWrapper<Account> qw = new QueryWrapper<>();

可以使用qw对象.的方式看看有哪些方法:

MybatisPlus基本使用(MP快速上手)

 看到列出来了许多条件,最基本的条件说明:

大于gt

小于 lt

大于等于 ge

小于等于 le

等于 eq

区间 between

我们就拿lt来举例,我们就设置条件为balance小于6000的。就应该这样写:

设置好条件后将条件对象给到selectList

@Test
void selecAlltTest() {
	QueryWrapper<Account> qw = new QueryWrapper<>();
	qw.lt("balance",6000);
	List<Account> accounts = accountDAO.selectList(qw);
	accounts.forEach(System.out::println);
}

查询结果: 

MybatisPlus基本使用(MP快速上手)

优化查询条件书写()

优化说明:由于qw.lt("balance",6000);这样的写法,balance是我们手动通过字符串的方式输入的,可能会存在人为书写时的错误,这时候我们就可以使用LambdaQueryWrapper,因为这样的写法会对属性进行语法检查,可以避免一些错误,使用如下:

@Test
void selecAlltTest() {
	//QueryWrapper<Account> qw = new QueryWrapper<>();
	//qw.lt("balance",6000);
	LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
	lqw.lt(Account::getBalance,6000);
	List<Account> accounts = accountDAO.selectList(lqw);
	accounts.forEach(System.out::println);
}

多条件设置方式:

在此设置条件为balance大于6000,小于9000。

@Test
void selecAlltTest() {
	LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
	//方式1
	lqw.lt(Account::getBalance,9000);
	lqw.gt(Account::getBalance,6000);
	//方式2:链式编程
	lqw.lt(Account::getBalance,9000).gt(Account::getBalance,6000);
	List<Account> accounts = accountDAO.selectList(lqw);
	accounts.forEach(System.out::println);
}

查询结果: 

 MybatisPlus基本使用(MP快速上手)

说明:在如上的操作中,关系均为and(默认),如果想使用or关系,可以这样写:

@Test
void selecAlltTest() {
	LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
	//方式1
	lqw.lt(Account::getBalance,9000);
	lqw.or().gt(Account::getBalance,6000);
	//方式2:链式编程
	lqw.lt(Account::getBalance,9000).or().gt(Account::getBalance,6000);
	List<Account> accounts = accountDAO.selectList(lqw);
	accounts.forEach(System.out::println);
}

至于其他的范围条件,例如等于eq,范围between,用法基本一致。 

条件:查询投影

查询投影,说白了就是:设置需要查询的字段。例如:select id from tb_test

里面的id,就是我们设置查询的字段。

//条件查询测试
@Test
void selectAllConditionTest() {
	LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
	lqw.select(Account::getName,Account::getBalance);
	List<Account> accounts = accountDAO.selectList(lqw);
	accounts.forEach(System.out::println);
}

说明:如果使用的是QueryWrapper,在select()中直接使用字符串传入即可。 

条件:模糊查询(非全文检索)

使用模糊查询,可以使用like,leftLike,rightLike ,他们的区别就是,把%放到什么位置,like放到两边

%like%,leftLike放左边%leck ,相当于是以什么结尾。rightLike相似。

在此演示name中包含字符"J"的记录了:

@Test
void selectAllConditionTest() {
	LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
	lqw.like(Account::getName,"J");
	List<Account> accounts = accountDAO.selectList(lqw);
	accounts.forEach(System.out::println);
}

查询结果

MybatisPlus基本使用(MP快速上手)

 条件:聚合函数和分组

在使用聚合函数和分组时,我们就不可以使用LambdaQueryWrapper了,只能使用QueryWrapper。使用如下(测试count):

//测试聚合函数和分组
@Test
void selectAllConditionTest1() {
	QueryWrapper<Account> qw = new QueryWrapper<>();
	qw.select("count(*)"); // 计数
	qw.groupBy("balance"); // 根据balance分组
	List<Map<String, Object>> maps = accountDAO.selectMaps(qw);
	System.out.println(maps);
}

输出结果 

MybatisPlus基本使用(MP快速上手) 结果说明,数据表数据: 

MybatisPlus基本使用(MP快速上手)

条件:排序操作        

排序操作演示:

 //MP查询排序
@Test
void selectConditionSort(){
	QueryWrapper<Account> qw = new QueryWrapper<>();
	qw.orderByAsc("balance");
	List<Account> accounts = accountDAO.selectList(qw);
	accounts.forEach(System.out::println);
}

说明:在其中orderByAsc为升序排序,要想使用降序,应该为orderByDesc ,我想这应该不用解释,SQL的知识。

查询结果: 

MybatisPlus基本使用(MP快速上手)

条件判断(条件为null时情况处理)

条件判断为null时,应用场景:当一个值的范围有上限和下限时,用户如果只设置一个,例如只设置上限,就应该以这一个条件进行查询,下限没设置就默认为null,,null的话就会报错,这是不合理的,合理情况应该是:当用户没有设置该条件时,条件应当不生效。当,因此需要对此进行判断处理(处理数据为null的情况)。相当于是动态SQL的处理情况。

需求:现在想要根据余额(balance)查询用户的信息,我们可以设置单独设置上限或下限,获取两者都设置,两者都设置的情况相当于区间。理想的情况是:当我们只设置一个条件时,例如,只设置上限,那么下限这个条件就不应该设置。这个时候,我们就要使用判断来做(判断条件是否为null)。

//条件查询(条件为null的处理情况)
@Test
void selectConditionCaseNull(){
//设置标记:标记为1条件存在 标记为0条件不存在
//下限标记
int downFlag = 1;
//上限标记
int upFlag = 0;

LambdaQueryWrapper<Account> lqw = new LambdaQueryWrapper<>();
//当upFlag不等于0,相当于上限条件已经设置,那么就查询记录中balance小于9000的记录。
lqw.lt(0 != upFlag ,Account::getBalance,9000);
//当upFlag不等于0,相当于下限条件已经设置,那么就查询记录中balance大于6000的记录。
lqw.gt(0 != downFlag,Account::getBalance,6000);
//由上面设置的标记,条件应该是只设置了下限,那么查询结果应该是大于6000
List<Account> accounts = accountDAO.selectList(lqw);
accounts.forEach(System.out::println);

}

查询结果:

发现确实只有一个条件执行。 

MybatisPlus基本使用(MP快速上手)


字段映射和表名映射

字段映射和表名映射说的主体就是"编码属性"和"表中字段"。

作用:解决实体类编码时的属性和表中字段匹配情况,解决表名和类名匹配的情况。以及字段限值问题。

**解决1**

情况:当我们的表名和实体类名不一致时,因为我们使用MP的内置方法时,传入的只有实体类的泛型,MP会根据这个传入的泛型去找到对应的操作表,我们知道传入的泛型就是实体类,如果实体类的类名和表中的表名不一致,那么就会导致找不到表,导致错误。先看一下报错信息:

表名和实体类名 

MybatisPlus基本使用(MP快速上手)

MybatisPlus基本使用(MP快速上手)  

报错信息:可以看到是Table 'test.account1' doesn't exist",同步异常,也就是无法匹配,表xx不存在。

MybatisPlus基本使用(MP快速上手)

 解决方案:

方案1:我们可以将实体类名改为Account,和数据库表保持一致。但是并不是最优解,因为我们在表的命名,一般有特殊要求,比如需要添加表名前缀tbl_等要求。则一般使用方案2。

方案2:在实体类上添加注解:@TableName("account"),但是如果是以这样的方式,那么我们将要给每一个实体类都添加一个注解,这是繁琐的。所以,我们可以将这个东西写到全局配置中,也就是写到配置文件中。书写方式如下:

 说明:由于表名一般设置前缀,但是实体类名不会设置前缀才会导致实体类名和表名不一致问题。所以我们一般会到配置文件中设置表名前缀,解决问题。

MybatisPlus基本使用(MP快速上手)


id生成策略

前置条件:需要将实体类ID属性的类型改为Long。表中的字段类型改为bigint。

id生成策略,说的就是我们insert操作时,对主键ID的设置,当我们没有设置ID的生成策略时,如果表中ID设置了自增,就会自动的生成自增ID,如果想要手动输入ID而不用自动生成,获取想要一个随机的ID,这样的设置,就是控制ID的生成策略。

设置方法:在配置文件中设置

可以看到支持的id生成策略:

MybatisPlus基本使用(MP快速上手)

 支持的ID生成策略说明:

MybatisPlus基本使用(MP快速上手)

雪花算法说明:

使用雪花算法生成的ID样子:" 一串很长的数字"

MybatisPlus基本使用(MP快速上手)

 雪花算法:根据时间戳,机器码和序列号生成一个64位的二进制转为十进制。

MybatisPlus基本使用(MP快速上手)

多数据操作

 多数据操作说的就是:一次性多数据删除和多数据查询。

操作:调用对应方法,参数传入集合。

演示:

//批量删除
@Test
void deletes(){
	List<Long> ids = new ArrayList<>();
	ids.add(8l);
	ids.add(9l);
	accountDAO.deleteBatchIds(ids);
}
//批量查询
@Test
void selects(){
	List<Long> ids = new ArrayList<>();
	ids.add(1l);
	ids.add(2l);
	accountDAO.selectBatchIds(ids);
}

测试结果: 

MybatisPlus基本使用(MP快速上手)

MybatisPlus基本使用(MP快速上手)文章来源地址https://www.toymoban.com/news/detail-446107.html

到了这里,关于MybatisPlus基本使用(MP快速上手)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenMV快速上手 | OpenMV硬件版本概述及HelloWorld

    OpenMV是一个国外的开源项目, 是一款低价、可扩展、支持Python的机器视觉模块 ,这个模块的目标是成为“机器视觉世界的Arduino “。 OpenMV的官网:https://openmv.io/。 OpenMV是完全开源的硬件 ,意味着所有版本的OpenMV硬件,你都可以在github下载到开发板的原理图、pcb,甚至是芯片

    2024年02月02日
    浏览(26)
  • 快速上手Linux核心命令(三):文件和目录操作命令

    目录 前言 cd 切换目录 pwd 显示当前路径 ls 显示目录下内容及相关属性信息 mkdir 创建目录 tree 以树形结构显示目录下的内容 touch 创建空白文件或改变文件的时间戳属性 cp 复制文件或目录 mv 移动或重命名文件 rm 删除文件或目录 chown 改变文件或目录的用户用户组 chmod 改变文件

    2023年04月23日
    浏览(46)
  • 快速上手linux | 一文秒懂Linux各种常用目录命令(上)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 首先我们要明白linux进入的命令行开头代码到底是什么意思: 我们来看下这张图片看完大家就懂了,详细列出了每一个字符的详细含义 前面我们知道了开头 local

    2024年02月04日
    浏览(32)
  • 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境)】

    视频地址: 尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】 尚硅谷大数据技术Spark教程-笔记02【SparkCore(核心编程、案例实操)】 尚硅谷大数据技术Spark教程-笔记03【SparkSQL(概述、核心编程、

    2023年04月15日
    浏览(43)
  • 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

    视频地址: 尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】 尚硅谷大数据技术Spark教程-笔记02【SparkCore(核心编程、案例实操)】 尚硅谷大数据技术Spark教程-笔记03【SparkSQL(概述、核心编程、

    2023年04月21日
    浏览(38)
  • 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】 视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】 尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】 尚硅谷大数据Flink1.17实

    2024年02月09日
    浏览(37)
  • 【Linux】基本指令——带你快速上手Linux

     在介绍Linux基本指令之前,我们需要对 操作系统 这一概念作进一步的认识,这样才能更好的帮助我们去理解指令操作。 先给出结论:  操作系统是一款 做软硬件管理 的 软件 。 应用软件 :Word、Matlab… 操作系统 :Windows、Linux… 设备驱动 :声卡驱动、网卡驱动… 硬件

    2024年02月11日
    浏览(31)
  • 快速上手: Linux环境配置, 基本指令与项目部署要点

    Linux 是由林纳斯·托瓦兹(Linus Torvalds)在 1991 年创立并发展至今成为服务器操作系统领域的核心系统。 Linux 与 Windows 一样,是一种操作系统(搞管理的软件),Linux 严格意义来说只是一个 “操作系统内核”;一个完整的操作系统 = 操作系统内核 + 配套的应用程序。 Linux 可以

    2024年02月10日
    浏览(30)
  • 如何在Windows使用 ffmpeg 转换整个目录?以MP4转MP3为例

    对于 Windows上键入命令如下: 在这里,我将所有 (.mp4) 文件转换为 (.mp3) 文件。 只需打开 cmd,转到所需的文件夹并键入命令。 快捷方式:(可选) 转到 (.mp4) 文件所在的文件夹 按 Shift 并左键单击并选择“在此处打开 PowerShell 窗口” 或“在此处打开命令提示符窗口” 键入“

    2023年04月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包