草庐IT

一篇玩转mybatis-plus框架的详细讲解(入门必备)

爪哇斗罗 2023-04-21 原文

 🐼个人主页:爪哇斗罗

🐼博主介绍:一名打工人

🐼签名:圣人之道,为而不争。

🐼一起交流,一起进步,一起互动。

目录

1. MybatisPlus简介与特性

1.1 简介

1.2 特性

2. MybatisPlus的开发环境搭建

2.1 创建User表

2.2 创建SpringBoot工程

2.3 配置application.yml

2.4 创建UserMapper并扫描

2.5 测试环境

3. 测试BaseMapper的增删改查

3.1 增加用户

3.2 删除用户

3.3 修改用户信息

3.4 查询用户

4. 通用Service接口测试

5. MybatisPlus的常用注解

5.1 @TableName

5.2 @TabeId

5.3 @TabeFiled

5.4 @TableLogic

7. 条件构造器介绍

7.1 QueyWrapper查询条件组装

7.2 QueyWrapper组装排序条件

7.3 QueryWrapper组装删除条件

7.4 QueyWrapper组装修改条件

7.5 UpdateWrapper组装修改条件

8. LambdaQueryWrapper与LambdaUpdateWrapper

9. LambdaQueryWrapper分页功能

9.1 配置分页插件


 

1. MybatisPlus简介与特性

1.1 简介

MybatisPlus作为MyBatis的一款增强工具,就是为了简化开发,为提高效率而生。同时还提供通用的Mapper与Service,无需写SQL的情况下对表进行增删改查,可以说是十分之优秀。

1.2 特性

在其官网上,我们可以了解到这款优秀框架的特性:

2. MybatisPlus的开发环境搭建

2.1 创建User表

user表SQL如下:

CREATE TABLE user (
    id BIGINT ( 20 ) NOT NULL COMMENT '主键ID',
    name VARCHAR ( 10 ) DEFAULT NULL COMMENT '姓名',
    age INT ( 11 ) DEFAULT NULL COMMENT '年龄',
    email VARCHAR ( 50 ) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY ( id ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;

2.2 创建SpringBoot工程

请使用IDEA快速创建一个SpringBoot的工程,在pom.xml中导入以下依赖,实体类User.java请自行创建。

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

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2.3 配置application.yml

application.yml配置数据库连接以及mybatis日志打印:

spring:
  application:
    name: mybatisplus
  datasource:
    # 数据源
    type: com.zaxxer.hikari.HikariDataSource
    # 驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 数据库连接
    url: jdbc:mysql://localhost:3306/my?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    # 用户名
    username: root
    #密码
    password: root

mybatis-plus:
  configuration:
    # 控制台日志打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.4 创建UserMapper并扫描

package com.jektong.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jektong.mybatisplus.pojo.User;
import org.springframework.stereotype.Repository;

/**
 * @author jektong
 * @date 2022年11月04日 1:14
 */
@Repository
public interface UserMapper extends BaseMapper<User> {
}

主启动类进行Mapper的扫描将接口注入至容器中: 

2.5 测试环境

package com.jektong.mybatisplus;

import com.jektong.mybatisplus.mapper.UserMapper;
import com.jektong.mybatisplus.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisplusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void contextLoads() {
        // 调用mybatisplus提供的共通查询方法
        List<User> users = userMapper.selectList(null);
        // 输出
        users.forEach(System.out::println);
    }

}

测试结果:打印出SQL语句并输出数据。

3. 测试BaseMapper的增删改查

3.1 增加用户

添加用户时使用insert方法,ID自动生成使用的是雪花算法

@Test
public void test02() {
    // 创建用户对象
    User user = new User();
    user.setName("钱三");
    user.setAge(20);
    user.setEmail("qiansan@qq.com");
    userMapper.insert(user);
    System.out.println("添加的用户ID="+user.getId());
}

执行程序如下:

3.2 删除用户

根据ID进行单个删除

@Test
public void testDeleteById() {
    // 指定删除的ID
    userMapper.deleteById(1588548601091469313L);
    System.out.println("用户ID=1588548601091469313已被删除");
}

执行程序如下:

根据ID进行批量删除

@Test
public void testDeleteByBatchId() {
    // 指定删除的ID
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    userMapper.deleteBatchIds(ids);
    System.out.println("用户ID=1,2已被删除");
}

构造Map条件进行删除

@Test
public void testDeleteById() {
    // 构建删除条件
    Map<String,Object> map = new HashMap();
    map.put("name","小张");
    map.put("age","22");
    userMapper.deleteByMap(map);
}

执行程序如下: 

3.3 修改用户信息

通过updateById进行删除:

@Test
public void testUpdateByBatchId() {
    // 指定修改的ID
    User user = new User();
    user.setId(4L);
    user.setAge(20);
    user.setName("za");
    userMapper.updateById(user);
    System.out.println("用户ID=4已被修改");
}

程序执行如下:

3.4 查询用户

查询用户,有以下这些查询的方法通过ID,批量传入ID,以及构建map条件进行查询数据。

不过对于复杂的条件查询,会根据条件构造器进行复杂的查询之后再说。 

@Test
public void testSelectUser() {
    userMapper.selectById(4l);
    // 查询全部
    List<User> users = userMapper.selectList(null);
    // map构建查询
    Map<String,Object> map = new HashMap();
    map.put("age","20");
    List<User> users1 = userMapper.selectByMap(map);
    // id批量查询
    Set<Long> ids = new HashSet<>();
    ids.add(4L);
    ids.add(3L);
    List<User> users2 = userMapper.selectBatchIds(ids);
    //分别输出
    users.forEach(System.out::println);
    users1.forEach(System.out::println);
    users2.forEach(System.out::println);
}

查询执行如下:

4. 通用Service接口测试

同样对于service层,也提供了通用service的增删改查的用法。首先建立UserService接口。此接口需要继承通用Service(IService)。

UserService.java

package com.jektong.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jektong.mybatisplus.pojo.User;

/**
 * @author jektong
 * @date 2022年11月06日 20:25
 */
public interface UserService extends IService<User> {
}

建立它的实现类UserServiceImpl.java

package com.jektong.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jektong.mybatisplus.mapper.UserMapper;
import com.jektong.mybatisplus.pojo.User;
import com.jektong.mybatisplus.service.UserService;

/**
 * @author jektong
 * @date 2022年11月06日 20:36
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

下面就来简单测试service中提供的方法,查询总记录数与批量插入

@Test
public void testUser() {
    // 查询总记录数
    int count = userService.count();
    System.out.println(count);
    // 批量插入
    List<User> userList = new ArrayList<>();
    User user1 = new User();
    user1.setName("ab");
    user1.setAge(23);
    user1.setEmail("ab@qq.com");
    userList.add(user1);
    User user2 = new User();
    user2.setName("abc");
    user2.setAge(23);
    user2.setEmail("abc@qq.com");
    userList.add(user2);
    userService.saveBatch(userList);
}

执行结果如下:

5. MybatisPlus的常用注解

5.1 @TableName

为解决实体类与表名不一致的情况下能够找到对应的数据库表,mybatisPlus提供了@TableName注解。 

如果数据库表名都是按照统一的命名方式进行命名(比如tb_xxx),这时候无需在每个实体类上都加入此注解,只需在yml文件配置表名前缀即可。

5.2 @TabeId

mybatisPlus会将每个表的id默认认为是主键如果表的id与实体类的id不一致的情况下会导致错误。

假设数据库中表的主键为uid,实体类中的表的主键为id,此时使用@TabeId的value属性将两者保持一致即可。

我们知道,在添加对象数据时id是默认使用雪花算法来生成id的,现在如果想要实现自动递增需要使用type属性。

首先我们需要将表中的id的自动递增选项勾选。然后配置属性type自动递增即可。

全局配置主键生成策略

同样当我们对每个表的id都进行了@TabeId配置并想都想让其进行自动递增此时需要在配置文件中配置主键的自增策略。

mybatis-plus:
  configuration:
    # 控制台日志打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 配置表名前缀
      table-prefix: t_
      # 全局配置主键生成策略
      id-type: auto

5.3 @TabeFiled

与id处理一致,如果类中的字段名称与表中的字段名不一致的情况下使用@TabeFiled将两者进行对应。

当然,字段名不一致mybatisPlus有默认的对应方式,就是默认下划线会转换为驼峰命名法。

例如表中的姓名字段为user_name,类中的姓名字段为userName两者不会冲突。如果是name就必须使用@TabeFiled注解了。

5.4 @TableLogic

为了使删除的数据容易恢复,mybatisPlus提供了逻辑删除的方式。

在表中添加字段is_delete后,实体类也需要添加对应变量,并加上@TableLogic注解

@Data
// 配置此注解可以使实体类与表名保持一致
@TableName("t_user")
public class User {

    @TableId(value = "uid")
    private Long id;

    private Integer age;

    @TableField("user_name")
    private String name;

    private String email;

    @TableLogic
    private Integer isDelete;
}

测试按照前面的方法再走一遍即可。

7. 条件构造器介绍

上面我们测试的是简单的增删改查,我们知道有的SQL查询需要复杂的查询条件。

所以mybatisPlus给我们提供了Wrapper这个最顶端抽象类父类。它所包含的子类如下图所示:

  • AbstractWrapper:用于查询条件的封装,封装where条件。
  • QueryWrapper:查询条件封装。
  • UpdateWrapper:修改条件封装
  • LambdaUpdateWrapper:使用Lambda语法进行更新条件封装。
  • LambdaQueryWrapper:使用Lambda语法进行查询条件的封装。

7.1 QueyWrapper查询条件组装

对于多条件的复杂查询我们可以通过构造QueryWrpper对象条件。

比如要查用户表中名字包含s,并且年龄在20到23之间,邮箱不为空的用户。

@Test
public void testQueryWrapperUser() {
    // 构造查询条件
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 查用户表中名字包含s,并且年龄在20到23之间,邮箱不为空的用户。
    queryWrapper.like("user_name", "s")
            .between("age", "20", "23")
            .isNotNull("email");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

执行如下:

7.2 QueyWrapper组装排序条件

在上述例子中,我们将其加入年龄升序,id降序排序的条件。

@Test
public void testQueryWrapperUser() {
    // 构造查询条件
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 查用户表中名字包含s,并且年龄在20到23之间,邮箱不为空的用户。
    queryWrapper.like("user_name", "s")
            .between("age", "20", "23")
            .isNotNull("email")
            .orderByDesc("age")
            .orderByDesc("id");
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

执行如下:

7.3 QueryWrapper组装删除条件

与查询条件一致,使用QueryWrapper构造删除条件:删除邮箱为空的用户。 

@Test
public void testQueryWrapperDelUser() {
    // 构造删除条件
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 删除邮箱为空的用户
    queryWrapper.isNull("email");
    int i = userMapper.delete(queryWrapper);
    System.out.println(i);
}

执行如下:

7.4 QueyWrapper组装修改条件

构造更新条件将邮箱为空的用户,年龄修改为45。

代码逻辑很简单主要就是在更新对象的时候使用update方法将更新的对象传入。

@Test
public void testQueryWrapperDelUser() {
    // 构造更新条件 将邮箱为空的用户,年龄修改为45
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    User user = new User();
    user.setAge(45);
    int i = userMapper.update(user, queryWrapper);
    System.out.println(i);
}

7.5 UpdateWrapper组装修改条件

上面通过了QueryWrapper进行修改条件的封装,此外也可以通过UpdateWrapper进行修改条件的封装。

@Test
public void testUpdateWrapperDelUser() {
    // 构造更新条件 将邮箱为空的用户,年龄修改为46
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("age",48).isNull("email");
    userMapper.update(null,updateWrapper);
}

请自行测试。

8. LambdaQueryWrapper与LambdaUpdateWrapper

在此之前,我们在构造查询或者修改条件的时候,都是直接去写表中的字段名,这样很容易出错,所以使用LambdaQueryWrapperLambdaUpdateWrapper去直接调用对象字段即可。

7.2使用LambdaQueryWrapper进行改造:

@Test
public void testQueryWrapperUser() {
    // 构造查询条件
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(User::getName, "s")
            .between(User::getAge, "20", "23")
            .isNotNull(User::getEmail)
            .orderByDesc(User::getAge)
            .orderByDesc(User::getId);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    users.forEach(System.out::println);
}

7.5使用LambdaUpdateWrapper进行改造:

@Test
public void testUpdateWrapperDelUser() {
    // 构造更新条件 将邮箱为空的用户,年龄修改为46
    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.set(User::getAge,"78").isNull(User::getEmail);
    userMapper.update(null,lambdaUpdateWrapper);
}

9. LambdaQueryWrapper分页功能

9.1 配置分页插件

面对数据过多,页面展示数据有限,mybatisPlus提供了分页插件功能。首先需要进行配置类进行配置。

MybatisPlusConfig.java

package com.jektong.mybatisplus.config;

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;

import javax.print.DocFlavor;

/**
 * @author jektong
 * @date 2022年11月11日 23:50
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 配置数据源:mysql
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

配置完分页插件后通过Page对象来完成分页:

@Test
public void testPageUser() {
    // 当前1页显示2条数据
    Page<User> pageUsers = new Page<>(1,2);
    // 查询数据
    userMapper.selectPage(pageUsers,null);
    System.out.println(pageUsers);
}

有关一篇玩转mybatis-plus框架的详细讲解(入门必备)的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  8. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  10. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

随机推荐