SpringBoot整合mybatis-plus进阶详细教程

目录
  • 前言
  • wapper介绍 :
  • 条件构造器 AbstractWrapper
    • 一、什么是AbstractWrapper
    • 二、QueryWrapper(LambdaQueryWrapper)
      • 1、QueryWrapper用法示例
      • 2、LambdaQueryWrapper用法示例
    • 三、UpdateWrapper(LambdaUpdateWrapper)
      • 1、UpdateWrapper用法示例
      • 2、LambdaUpdateWrapper用法示例
  • mybatis-plus的插件
    • 一、分页插件
      • 1、配置分页插件
      • 2、测试代码
      • 3、自定义分页条件
    • 二、性能分析插件
    • 三、执行分析插件
      • 1、配置插件
      • 2、测试代码
      • 3、执行结果

前言

关于mybatis-plus的简介以及基本使用,我在《SpringBoot整合mybatis-plus–入门超详细》一文中已做介绍,此处不再赘述。本文主要对mybatis-plus的条件构造器、AR模式、插件、逆向工程、自定义全局操作、公共字段自动填充等知识点进行讲解。

wapper介绍 :

Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作

条件构造器 AbstractWrapper

上一节我们完成了基于mybatis-plus的CRUD操作,这一节我们来学习一下使用mybatis-plus中的条件构造器——AbstractWrapper。

一、什么是AbstractWrapper

QueryWrapper(LambdaQueryWrapper)UpdateWrapper(LambdaUpdateWrapper)的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为

首先我们来介绍一下AbstractWrapper,下图是AbstractWrapper的一个继承结构:

二、QueryWrapper(LambdaQueryWrapper)

由于其中方法太多就不一一赘述,想看全部方法用法可以看官网介绍或者看我的实例代码

1、QueryWrapper用法示例

查询id在1 - 30且性别为男、姓名带有test的用户:

@SpringBootTest
@SuppressWarnings("unchecked")
public class UserWrapperTest {

    @Autowired
    UserMapper userMapper;
    @Test
    public void TestQueryWrapper(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.like("name","test");
        userQueryWrapper.eq("sex","男");
        userQueryWrapper.between("id",1,30);
        userMapper.selectList(userQueryWrapper).forEach(System.out::println);
    }
}

:eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。
此处like方法就是查询name中包含“test”字样的记录;between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间。
注意column是数据表对应的字段,而非实体类属性字段。

运行日志

2、LambdaQueryWrapper用法示例

LambdaQueryWrapper是mybatis plus中的一个条件构造器对象,只是是需要使用Lambda 语法使用 Wrapper

@Test
    public void TestLambdaQueryWrapper() {
        LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
        lambdaWrapper.like(User::getName,"test");
        lambdaWrapper.eq(User::getSex,"男");
        lambdaWrapper.between(User::getId,1,30);
        userMapper.selectList(lambdaWrapper).forEach(System.out::println);
    }

运行日志

三、UpdateWrapper(LambdaUpdateWrapper)

我们再进行更新或者删除的时候,有时候where条件复杂的话,可以使用UpdateWrapper来构造条件
他们有部分方法是和上面的QueryWrapper(LambdaQueryWrapper) 相同的。这里演示不同之处

1、UpdateWrapper用法示例

将名字包含test1的用户名改为test1.1 :

 @Test
    public void TestUpdateWrapper() {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        //继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件
        //及 LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!
        User user = User.builder().build();
        //修改语句
        updateWrapper.set("name", "test1.1");
        //条件
        updateWrapper.like("name", "test1");
        userMapper.update(user, updateWrapper);
    }

运行日志

2、LambdaUpdateWrapper用法示例

 @Test
    public void TestLambdaUpdateWrapper() {
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        //LambdaUpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().lambda();
        User user = User.builder().build();
        //修改语句
        updateWrapper.set(User::getName, "test1.1");
        //条件
        updateWrapper.like(User::getName, "test1");
        userMapper.update(user, updateWrapper);
    }

mybatis-plus的插件

mybatis-plus提供了很多好用的插件,而且配置简单,使用方便。接下来一起看看MP的插件如何使用。

一、分页插件

BaseMapper的selectPage方法和AR提供的selectPage方法都不是物理分页,需要配置分页插件后才是物理分页,那么现在就来看看如何配置这个插件。分页查询

1、配置分页插件

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;

/**
 * @program: springboot
 * @description:
 * @author: King
 * @create: 2021-09-08 13:18
 */
@Configuration
public class MybatisPlusConfig {
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     * 3.4.3不用设置
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
}

这个配置摘抄自官方示例

2、测试代码

@Autowired
    UserMapper userMapper;

   @Test
    public void Test2() {
        //配置了分页插件后,使用selectpage方法,
        //但是现在就是真正的物理分页了,sql语句中有limit了
        Page<User> page = new Page<>(1, 10);
        IPage<User> selectPage = userMapper.selectPage(page, null);
        System.out.println(selectPage);
        System.out.println("================= 相关的分页信息 ==================");
        System.out.println("总条数:" + selectPage.getTotal());
        System.out.println("当前页码:" + selectPage.getCurrent());
        System.out.println("总页数:" + selectPage.getPages());
        System.out.println("每页显示条数:" + selectPage.getSize());
        System.out.println("是否有上一页:" + page.hasPrevious());
        System.out.println("是否有下一页:" + page.hasNext());
        System.out.println("查询结果:");
        List<User> list = selectPage.getRecords();
        list.forEach(o -> System.out.println(o));
//        page.getRecords().forEach(o -> System.out.println(o));
        //还可以将查询到的结果set进page对象中
        page.setRecords(list);
        //也可以通过page调用相关方法获取到相关的分页信息,而且还可以把查询到的结果set回page对象中,方便前端使用。
    }

运行结果

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17aa8a11] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1963906615 wrapping com.mysql.cj.jdbc.ConnectionImpl@5190010f] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) FROM User
==> Parameters:
<==    Columns: COUNT(*)
<==        Row: 31
<==      Total: 1
==>  Preparing: SELECT id,name,sex,pwd,email FROM User LIMIT ?
==> Parameters: 10(Long)
<==    Columns: id, name, sex, pwd, email
<==        Row: 2, test1.1, 女, aaaa, 1231@qq.com
<==        Row: 3, test2, 男, aaaa, 1232@qq.com
<==        Row: 4, test3, 女, aaaa, 1233@qq.com
<==        Row: 5, test4, 男, aaaa, 1234@qq.com
<==        Row: 6, test5, 女, aaaa, 1235@qq.com
<==        Row: 7, test6, 男, aaaa, 1236@qq.com
<==        Row: 8, test7, 女, aaaa, update@qq.com
<==        Row: 9, test8, 男, aaaaaa, 1238@qq.com
<==        Row: 42, test, 男, aaa, a@qq.com
<==        Row: 43, test, 男, aaa, a@qq.com
<==      Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17aa8a11]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@44286963
================= 相关的分页信息 ==================
总条数:31
当前页码:1
总页数:4
每页显示条数:10
是否有上一页:false
是否有下一页:true
查询结果:
User(id=2, name=test1.1, sex=女, pwd=aaaa, email=1231@qq.com)
User(id=3, name=test2, sex=男, pwd=aaaa, email=1232@qq.com)
User(id=4, name=test3, sex=女, pwd=aaaa, email=1233@qq.com)
User(id=5, name=test4, sex=男, pwd=aaaa, email=1234@qq.com)
User(id=6, name=test5, sex=女, pwd=aaaa, email=1235@qq.com)
User(id=7, name=test6, sex=男, pwd=aaaa, email=1236@qq.com)
User(id=8, name=test7, sex=女, pwd=aaaa, email=update@qq.com)
User(id=9, name=test8, sex=男, pwd=aaaaaa, email=1238@qq.com)
User(id=42, name=test, sex=男, pwd=aaa, email=a@qq.com)
User(id=43, name=test, sex=男, pwd=aaa, email=a@qq.com)

可以看到通过分页插件 sql语句中已经有了limit,是物理分页了。并且是否有上一页下一页也有展示非常好用

3、自定义分页条件

示例:
只需要在你的 UserMapper.java 中加入你自定义的分页方法,也可以按你自定义方法实现分页。UserMapper可以继承或者不继承BaseMapper

@Mapper
//表明这是一个Mapper,也可以在启动类上加上包扫描
//Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
public interface UserMapper extends BaseMapper<User> {
    /**
     * 查询 : 根据性别查询用户列表,分页显示
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @param sex 性别
     * @return 分页对象
     */
    @Select("SELECT * FROM user WHERE sex = #{sex}")
    IPage<User> selectPageBySex(Page<?> page, String sex);
}

测试代码

 @Test
    public void Test3() {
        Page<User> page = new Page<>(2, 10);
        IPage<User> selectPage = userMapper.selectPageBySex(page, "男");
        System.out.println("================= 相关的分页信息 ==================");
        System.out.println("总条数:" + selectPage.getTotal());
        System.out.println("当前页码:" + selectPage.getCurrent());
        System.out.println("总页数:" + selectPage.getPages());
        System.out.println("每页显示条数:" + selectPage.getSize());
        System.out.println("是否有上一页:" + page.hasPrevious());
        System.out.println("是否有下一页:" + page.hasNext());
        System.out.println("分页结果");
        selectPage.getRecords().forEach(System.out::println);
    }

运行结果

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1312762120 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e87ef9e] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) FROM user WHERE sex = ?
==> Parameters: 男(String)
<==    Columns: COUNT(*)
<==        Row: 17
<==      Total: 1
==>  Preparing: SELECT * FROM user WHERE sex = ? LIMIT ? OFFSET ?
==> Parameters: 男(String), 10(Long), 10(Long)
<==    Columns: id, name, sex, pwd, email
<==        Row: 52, test28, 男, aaaa, a28@qq.com
<==        Row: 54, test30, 男, aaaa, a30@qq.com
<==        Row: 56, test32, 男, aaaa, a32@qq.com
<==        Row: 58, test34, 男, aaaa, a34@qq.com
<==        Row: 60, test36, 男, aaaa, a36@qq.com
<==        Row: 62, test38, 男, aaaa, a38@qq.com
<==        Row: 64, Test, 男, aaaaa, 1234@qq.com
<==      Total: 7
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853]
================= 相关的分页信息 ==================
总条数:17
当前页码:2
总页数:2
每页显示条数:10
是否有上一页:true
是否有下一页:false
分页结果
User(id=52, name=test28, sex=男, pwd=aaaa, email=a28@qq.com)
User(id=54, name=test30, sex=男, pwd=aaaa, email=a30@qq.com)
User(id=56, name=test32, sex=男, pwd=aaaa, email=a32@qq.com)
User(id=58, name=test34, sex=男, pwd=aaaa, email=a34@qq.com)
User(id=60, name=test36, sex=男, pwd=aaaa, email=a36@qq.com)
User(id=62, name=test38, sex=男, pwd=aaaa, email=a38@qq.com)
User(id=64, name=Test, sex=男, pwd=aaaaa, email=1234@qq.com)

二、性能分析插件

这个插件PerformanceInterceptor在3.2.0被移除了,如果想进行性能分析,用第三方的,官方这样写的“该插件 3.2.0 以上版本移除推荐使用第三方扩展 执行 SQL 分析打印 功能

三、执行分析插件

–防止全表更新与删除

1、配置插件

和上面的分页插件类似

 //BlockAttackInnerInterceptor
    //针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor3() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 执行分析插件
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        return interceptor;
    }

2、测试代码

 @Test
    public void Test4(){
        //条件为null,就是删除全表,执行分析插件会终止该操作
        userMapper.delete(null);
    }

3、执行结果

运行该junit测试,可以看到报如下错误,说明该插件生效了。

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e9f2c32] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@480645280 wrapping com.mysql.cj.jdbc.ConnectionImpl@49433c98] will not be managed by Spring
original SQL: DELETE FROM User
SQL to parse, SQL: DELETE FROM User
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e9f2c32]

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database.  Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of full table deletion
### The error may exist in com/king/mybatis_plus/mapper/UserMapper.java (best guess)
### The error may involve com.king.mybatis_plus.mapper.UserMapper.delete
### The error occurred while executing an update
### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of full table deletion

未完待续。。。

到此这篇关于SpringBoot整合mybatis-plus进阶详细教程的文章就介绍到这了,更多相关SpringBoot整合mybatis-plus内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot整合mybatis-plus代码生成器的配置解析

    AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.Controller 等各个模块的代码,极大的提升了开发效率. 具体实实现以及配置解析如下: package mybatis_plus; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annot

  • springboot整合mybatis-plus 实现分页查询功能

    建一个config类 @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } } 编写controller post /article/search/{page}/{size} @PostMapping("search/{page}/{size}") p

  • 使用springboot整合mybatis-plus实现数据库的增删查改示例

    1.准备数据库中的表及表中的数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.6.11 : Database - mp ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQ

  • SpringBoot中整合MyBatis-Plus的方法示例

    MyBatis 框架相信大家都用过,虽然 MyBatis 可以直接在 xml 中通过 SQL 语句操作数据库,很是灵活.但正其操作都要通过 SQL 语句进行,就必须写大量的 xml 文件,很是麻烦.于是 MyBatis-Plus 应运而生,作为 MyBatis 的增强工具,更是为我们开发效率得到了质的飞跃. 一.简介 1.MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工

  • springboot整合Mybatis-plus的实现

    1.添加pom引用 maven的引用很简单,官方已经给出starter,不需要我们考虑它的依赖关系了,此处使用的是2.3版本. <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.3</version> </dependency> 2.配置 serve

  • springboot整合mybatis-plus实现多表分页查询的示例代码

    1.新建一个springboot工程 2.需要导入mybatis和mybatis-plus的依赖文件 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> &l

  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    目录 一.简单介绍 二具体配置 2.1.配置相关的依赖. 2.2 写.mapper.controller.service 2.2.1mapper文件 2.2.2service文件 2.2.2controller文件 2.3配置相关文件 三.结果截图 四.可能遇到的报错 一.简单介绍 1.配置相关的依赖2.配置模式3写.mapper.controller.service4.配置yaml文件 配置mybatis全局配置文件(这里我使用的是配置模式+注解模式所以需要配置全局文件) 二具体配置 2.1.

  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    目录 前言 准备工作 整合步骤 前言 在真实的项目开发中,使用SpringBoot可以说非常普遍了,而在框架整合中,与数据库的交互无外乎使用jpa,mybatis,mybatis-plus这几种,虽然hibernate仍然有在使用,毕竟框架毕竟重,而且用起来相较于mybatis还是差了那么点意思: 接下来演示下使用 SpringBoot 同时与mybatis,mybatis-plus的整合步骤: 准备工作 1.准备如下一个数据表 CREATE TABLE `student` ( `id` var

  • SpringBoot整合Spring Security的详细教程

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.提供了完善的认证机制和方法级的授权功能.是一款非常优秀的权限管理框架.它的核心是一组过滤器链,不同的功能经由不同的过滤器.这篇文章就是想通过一个小案例将Spring Security整合到SpringBoot中去.要实现的功能就是在认证服务器上

  • SpringBoot整合mybatis-plus进阶详细教程

    目录 前言 wapper介绍 : 条件构造器 AbstractWrapper 一.什么是AbstractWrapper 二.QueryWrapper(LambdaQueryWrapper) 1.QueryWrapper用法示例 2.LambdaQueryWrapper用法示例 三.UpdateWrapper(LambdaUpdateWrapper) 1.UpdateWrapper用法示例 2.LambdaUpdateWrapper用法示例 mybatis-plus的插件 一.分页插件 1.配置分

  • 详解SpringBoot整合MyBatis详细教程

    1. 导入依赖 首先新建一个springboot项目,勾选组件时勾选Spring Web.JDBC API.MySQL Driver 然后导入以下整合依赖 <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> &

  • SpringBoot整合MyBatis超详细教程

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也非常方便. 下面从配置模式.注解模式.混合模式三个方面进行说明MyBatis与SpringBoot的整合. 1.1.配置模式 MyBatis配置模式是指使用mybatis配置文件的方式与SpringBoot进行整合,相对应的就有mybatis-config.xml(用于配置驼峰命名,也可以省略这个文

  • 使用sts工具、SpringBoot整合mybatis的详细步骤

    SpringBoot 集成 Mybatis 框架 一.1.SpringBoot 集成 Mybatis 的基本步骤 第一步:添加依赖: 第二步:配置数据源: 第三步:扫描接口包. 二.详细的集成步骤如下: 1.第一步:添加依赖: 添加依赖:除了常规依赖外,需要加入 Mybatis 代码如下(示例): <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XM

  • SpringBoot整合Mybatis与MybatisPlus方法详细讲解

    目录 一.整合MyBatis操作 1.配置模式 2.注解模式 3.混合模式 二.整合 MyBatis-Plus 完成CRUD 1.什么是MyBatis-Plus 2.整合MyBatis-Plus 3.CRUD功能 一.整合MyBatis操作 官网:MyBatis · GitHub SpringBoot官方的Starter:spring-boot-starter-* 第三方的starter的格式: *-spring-boot-starter <dependency> <groupId>

  • 从零搭建SpringBoot2.X整合Redis框架的详细教程

    最近也不知道写啥,看之前写过Kafka整合Springboot的文章,大家反响还挺热烈的,嘿嘿嘿,就感觉帮助到大家了还挺好的,也算是达到了自己的目的,正好,今天业务模块是springboot整合redis,因为之前做过,所以有现成的代码,cv一下之后就可以了,所以时间比较多,那就给大家整理一下Springboot整合Redis的代码实现吧,从项目搭建到源码实现,下面全都有,耐心看完,相信会对你有所帮助的 好了,话不多说,我们开始吧,同样的,还是建议能够自己在自己的PC端实现一下 个人公众号:Ja

  • SpringBoot整合Mybatis简单实现增删改查

    目录 前言 第一:创建MySQL数据库 第二:创建SpringBoot项目,引入需要的依赖包 第三:创建程序目录和配置核心application.xml文件 第四:依次编写Entity.Dao.Service.Controller层,还有创建mapper.xml文件 第五:测试结果(这里我用的postman来进行接口测试) 第六:总结 前言 为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能,不然怎么完成给你分

随机推荐