【微服务核心】MyBatis Plus

MyBatis Plus

文章目录

  • MyBatis Plus
  • 1. 简介
  • 2. 入门使用
  • 3. 核心功能
    • 3.1 CRUD 接口
      • 3.1.1 Mapper CRUD 接口
      • 3.1.2 Service CRUD 接口
    • 3.2 条件构造器
    • 3.3 分页插件
    • 3.4 Mybatis-Plus 注解
  • 4. 拓展
    • 4.1 逻辑删除
    • 4.2 MybatisX快速开发插件
  • 5. 插件
    • 5.1 [分页插件](#page)
    • 5.2 乐观锁插件

1. 简介

MyBatis Plus,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官网:https://baomidou.com/ ,下面功能及使用都可从官网找到

MyBatis Plus 具有以下特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2. 入门使用

  1. 创建Maven工程

  2. 添加依赖,这里给一份 springboot3 较为完整依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version>
    </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency>
    </dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
    </build>
    
  3. 启动类配置 @MapperScan("com.springboot.mapper") mapper接口扫描注解

  4. 配置文件 application.yaml

    spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: rooturl: jdbc:mysql:///mybatisplusdriver-class-name: com.mysql.cj.jdbc.Driver
    
  5. 编写 mapper 接口,继承 BaseMapper ,继承mybatis-plus提供的基础Mapper接口,将自带crud方法

部分约定配置:

map-underscore-to-camel-case :下划线驼峰命名,默认开启

mapper扫描:classpath*:/mapper/**/*.xml

3. 核心功能

3.1 CRUD 接口

3.1.1 Mapper CRUD 接口

官网:https://baomidou.com/pages/49cc81/#mapper-crud-接口

使用时:ScheduleMapper extends BaseMapper<Schedule>

  • 通用 CRUD 封装 BaseMapper 接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
  • 泛型 T 为任意实体对象
  • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
  • 对象 Wrapper 为 条件构造器

ScheduleMapper 将包含 BaseMapper 中的一系列增删改查及分页查询方法

3.1.2 Service CRUD 接口

官网:https://baomidou.com/pages/49cc81/#service-crud-接口

  • 通用 Service CRUD 封装 IService 接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 对象 Wrapper 为 条件构造器

3.2 条件构造器

在这里插入图片描述

Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    • QueryWrapper : 查询/删除条件封装
    • UpdateWrapper : 修改条件封装
    • AbstractLambdaWrapper : 使用Lambda 语法
      • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

组装条件:

在这里插入图片描述

这里仅介绍基于 Lambda 的条件封装的使用,非 Lambda 自行创建对象 QueryWrapper 用类似方法进行拼接即可

LambdaQueryWrapper

@RequestMapping("query")
public Result<List<Schedule>> query() {LambdaQueryWrapper<Schedule> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Schedule::getId, 2);return new Result<>(scheduleService.list(queryWrapper));
}

LambdaUpdateWrapper :使用 set() 方法设置属性

@RequestMapping("update")
public Result<Boolean> update() {LambdaUpdateWrapper<Schedule> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(Schedule::getId, 2).eq(Schedule::getCompleted, 0);updateWrapper.set(Schedule::getCompleted, 1).set(Schedule::getTitle, "学个P呀");return new Result<>(scheduleService.update(updateWrapper));
}

3.3 分页插件

配置方法:配置类中,将 MybatisPlusInterceptor 注入 IoC容器中,注入前添加 PaginationInnerInterceptor 拦截器

@MapperScan("com.springboot.mapper")
@SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}

使用默认实现的分页:scheduleService.page 返回的是 Page 对象,与 new Page 是同一个,只是对象中有了更多信息

@RequestMapping("query")
public Result<Page<Schedule>> query() {Page<Schedule> page = new Page<>(1,5);return new Result<>(scheduleService.page(page));
}

Page :该类继承了 IPage 类,实现了 简单分页模型 如果你要实现自己的分页模型可以继承 Page 类或者实现 IPage

属性名类型默认值描述
recordsListemptyList查询数据列表
totalLong0查询列表总记录数
sizeLong10每页显示条数,默认 10
currentLong1当前页
ordersListemptyList排序字段信息,允许前端传入的时候,注意 SQL 注入问题,可以使用 SqlInjectionUtils.check(...) 检查文本
optimizeCountSqlbooleantrue自动优化 COUNT SQL 如果遇到 jSqlParser 无法解析情况,设置该参数为 false
optimizeJoinOfCountSqlbooleantrue自动优化 COUNT SQL 是否把 join 查询部分移除
searchCountbooleantrue是否进行 count 查询,如果只想查询到列表不要查询总记录数,设置该参数为 false
maxLimitLong单页分页条数限制
countIdStringxml 自定义 count 查询的 statementId 也可以不用指定在分页 statementId 后面加上 _mpCount 例如分页 selectPageById 指定 count 的查询 statementId 设置为 selectPageById_mpCount 即可默认找到该 SQL 执行

自定义分页方法接口:

//传入参数携带Ipage接口
//返回结果为IPage
IPage<User> selectPageVo(IPage<?> page, Integer id);
<select id="selectPageVo" resultType="xxx.xxx.xxx.User">SELECT * FROM user WHERE id > #{id}
</select>

如果返回类型是 IPage 则入参的 IPage 不能为null,因为 返回的 IPage == 入参的IPage;如果想临时不分页,可以在初始化 IPage 时 size 参数传 <0 的值;
如果返回类型是 List 则入参的 IPage 可以为 null(为 null 则不分页),但需要你手动 入参的IPage.setRecords(返回的 List);
如果 xml 需要从 page 里取值,需要 page.属性 获取

注意:多个插件使用的情况,请将分页插件放到 插件执行链 最后面。如在租户插件前面,会出现 COUNT 执行 SQL 不准确问题

3.4 Mybatis-Plus 注解

详情可参考官网:https://baomidou.com/pages/223848/#tablename

  • @TableName :表名注解,标识实体类对应的表
  • @TableId :主键注解。type指定为 ASSIGN_ID 会调用主键生成默认实现类,以雪花算法生成 ID
  • @TableField :字段注解(非主键)
  • @Version :乐观锁注解
  • @TableLogic :逻辑处理注解,增加注解后删除会进行逻辑删除。默认逻辑删除属性已删除值为 1,未删除值为 0。也可通过 mybatis-plus.global-config.db-config.logic-delete-field 配置全局逻辑删除属性。二者必须配置一个逻辑删除才会生效,注意也会影响默认查询逻辑,查询中会过滤逻辑删除的数据
  • @OrderBy :内置 SQL 默认指定排序,优先级低于 wrapper 条件查询

4. 拓展

4.1 逻辑删除

  1. 配置 application.yaml ,从 3.3.0 版本开始,可以忽略不配置 @TableLogic 注解
mybatis-plus:global-config:db-config:logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 实体类字段上加上 @TableLogic 注解

4.2 MybatisX快速开发插件

在 idea 插件中搜索 MybatisX ,安装后右侧导航栏(Datasbase)连接数据源后,即可选择表右键直接生成代码

在这里插入图片描述

如果需要生成是子模块代码,这里需要手动填一下子模块目录,目前版本选中子模块不会自动填入,如我这里是 T01

  • relative package :实体类的生成包

在这里插入图片描述

之后需选中 Model 才会生成实体类

在这里插入图片描述

5. 插件

目前已有的功能:

  • 自动分页: PaginationInnerInterceptor
  • 乐观锁: OptimisticLockerInnerInterceptor
  • 多租户: TenantLineInnerInterceptor
  • 动态表名: DynamicTableNameInnerInterceptor
  • 非法SQL拦截: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor
  • 数据权限:DataPermissionInterceptor
  • 数据变动记录:DataChangeRecorderInnerInterceptor

插件配置:注入 MybatisPlusInterceptor 对象即可,注入前把需要的对应拦截器添加到该对象中

@MapperScan("com.springboot.mapper")
@SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}

注意:

使用多个功能需要注意顺序关系,建议使用如下顺序

  • 多租户,动态表名
  • 分页,乐观锁
  • sql 性能规范,防止全表更新与删除

总结: 对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入

具体可参考官网使用:https://baomidou.com/pages/2976a3/

5.1 分页插件

5.2 乐观锁插件

配置完拦截器后在实体类的字段上加上 @Version 注解即可

说明:

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1newVersion 会回写到 entity
  • 仅支持 updateById(id)update(entity, wrapper) 方法
  • update(entity, wrapper) 方法下, wrapper 不能复用!!!

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

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

相关文章

如何从RTP包的AP类型包,获取h265的PPS、SPS、VPS信息

ffmpeg播放rtp流&#xff0c;为了降低首开延迟&#xff0c;需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。需要自己进行AP包解析。RTP协议AP包格式如下&#xff1a; 根据如上信息&#xff0c;我们可以解析AP包&#xff0c;效果如下 40 01&#xff…

Windows上安装NodeJs

Windows上安装NodeJs 一、操作环境 操作系统: Windows 10 专业版 SDK:NodeJs v16.19.1&#xff08;安装鸿蒙IDE自动安装的NodeJs&#xff09; 二、安装过程 2.1下载Node.js安装包 官网下载地址&#xff1a; 下载历史版本安装也可 2.2 双击下载好的安装文件 2.3 打开下载…

ClickHouse基础知识(五):ClickHouse的SQL 操作

基本上来说传统关系型数据库&#xff08;以 MySQL 为例&#xff09;的 SQL 语句&#xff0c;ClickHouse 基本都支持&#xff0c; 这里不会从头讲解 SQL 语法只介绍 ClickHouse 与标准 SQL&#xff08;MySQL&#xff09;不一致的地方。 1. Insert 基本与标准 SQL&#xff08;My…

如何基于一台MacBook搞定企业级大模型知识库部署

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《ChatGLM3/Qwen业务案例实战》 —1— 为什么要在 MacBook 上搭建知识库&#xff1f; 最核心最重要的是我们手上的文档资料出于安全要求&#xff0c;不能随便上传到云服务&#xff0c;也就无法实际验证知识库的…

统信操作系统中QWebEngine(js与C++交互)

一、直接方式C++调用JS函数 1.1 编写C++界面框架 界面有两个控件组成。QWebEngineView和QPushButton组成。上面部分位webengineview 下面部分位C++的按钮。 处理逻辑是希望按钮按下QPushButton的直接调用QWebEngineView中js定义好的函数。 大致内容如下图: mainwindow.cpp文…

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成&#xff0c;可以发现n3时的二叉搜索树可以由&#xff0c;头节点分别为1、2、3时的所有结果组成&#xff01;定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式&#xff0c;dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束&#xff1a;any三、支持比较操作的内置约束&#xff1a;comparable四、自定义约束五、类型集合&#xff08;type set&#xff09;六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

等保测评里面,帐号和短信验证码双因子认证机制

短信验证参数检查过滤器 public class MultiTextMessageFilter implements Filter {private AntPathRequestMatcher matcher new AntPathRequestMatcher("/oauth/token");Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterC…

电脑亮度怎么调?揭开亮度调节的秘密!

电脑亮度调节是一项基本的系统设置&#xff0c;它不仅影响我们的视觉体验&#xff0c;还有助于减轻眼部疲劳。可是电脑亮度怎么调呢&#xff1f;本文将介绍三种不同的电脑亮度调节方法&#xff0c;适用于Windows和常见的笔记本电脑&#xff0c;让您的屏幕明亮如新。 方法1&…

数据库管理-第128期 2023总结(202301229)

数据库管理-第128期 2023总结&#xff08;202301229&#xff09; 到了2023年的最后一个工作日&#xff0c;也该对即将过去的2023年做一个小小的总结&#xff1a; 1 写文章 2023年在CSDN总共写了82篇文章。 2023年4月开始在墨天轮写文章&#xff0c;总共写了75篇文章&#xf…

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者&#xff1a;柳下 概述 随着企业规模和数据量的增长&#xff0c;数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂&#xff0c;因此及时捕获和处理这些变化变得至关重要。为了满足这一需求&#xff0c;数据库 CDC&#xff08;Change Data Capture&#xff…

Python自动化办公指南

文章目录 前言文件处理数据处理网络爬虫自动化操作 如何开始Python自动化办公结论Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全职路线 前言 Python自动化办公一般可以分为…

C实现数组奇数在前偶数在后排序

一、运行结果&#xff1b; 二、源码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现调整函数move_odd_even函数&#xff1b; void move_odd_even(int arr[], int sz) {//初始化变量值&#xff1b;int left 0;int right sz - 1;//循环判断和…

作业--day38

1.定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xff…

安装 PyQt5 保姆级教程

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 博主之前做应用层开发用的一直是 Qt&#xff0c;这次尝试一下在 python 中使用 Pyqt5 模块来开发 UI 界面&#xff0c;这里做一些…

(JAVA)-(多线程)-线程池

线程池&#xff0c;顾名思义就是存放线程的池子&#xff0c;当有任务时能够随时取用线程&#xff0c;任务结束后能够放回线程池中。如果把线程比成碗&#xff0c;线程池就像一个碗柜一样。 使用线程池的好处&#xff1a; 1.当有大量线程对象时&#xff0c;减少了线程创建销毁…

获取拼多多商品详情页数据SKU价格等

拼多多根据ID取商品详情 API 返回值说明 item_get-根据ID取商品详情 pinduoduo.item_get 响应参数 请求测试链接 名称类型必须示例值描述 num_iid String01999629976商品ID title String02019新款女装短袖t恤女夏宽松韩版休闲上衣百搭蝙蝠衫五分袖体恤商品标题 price Flo…

Ubuntu安装K8S(1.28版本,基于containrd)

原文网址&#xff1a;Ubuntu安装K8S(1.28版本&#xff0c;基于containrd&#xff09;-CSDN博客 简介 本文介绍Ubuntu安装K8S的方法。 官网文档&#xff1a;这里 1.安装K8S 1.让apt支持SSL传输 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certi…

mysqlCPU超过100%的详细解决过程

前段时间我的一个网站经常打不开,通过检查发现服务器cpu占用超过100%,通过top命令发现是mysql占用cpu特别高导致的,下面这篇文章主要给大家介绍了关于mysql占用CPU超过100%的详细解决过程,需要的朋友可以参考下 一、使用top命令看到的情况如下&#xff1a; 可以看到服务器负载…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…