分享好友 最新动态首页 最新动态分类 切换频道
MybatisPlus-快速上手
2024-12-27 10:45

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

MybatisPlus-快速上手

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

任何能使用 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb
  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAYqYRh2-1653734436948)(D:Typora DataMybatisPlus.assets1653706687938.png)]

我们创建一个mybatisplus的数据库,并插入一张user表

 
 

在真实开发中,还需要添加version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modified

我们新建一个springboot基本项目即可,添加上我们的web依赖、和lombok插件以及mysql依赖。

 

说明:使用mybatis-plus可以节省我们大量的代码,尽量不要同时导入mybatis和mybatis-plus!因为会有版本差异

 
 

这一步跟mybatis操作相同,mysql5 和mysql8驱动有所不同,8需要增加时区的配置

在IDEA中连接数据库就不做过多介绍了,在我博客关于mybatis中有详细介绍,当然,网上也有很多资料。

User

 
 

UserMapper,在mybatis中,你还需要写相应的xml,但是在MyabtisPlus中,你完全不需要,你只需要继承一个接口BaseMapper即可,至此,所有的CRUD代码已经完成。

 

注意:这里要添加User的泛型

 

注意:扫描路径不要写错

注意:我们在mapper中,没有写任何的CRUD代码

 

结果

 

全部都查出来的,我们没有编写任何的CRUD代码

https://www.shuzhiduo.com/A/kmzL4NWKzG/

 
 

我们所有的sql现在是不可见的,我们希望知道它是怎么执行的,所以我们必须要看日志

我们在application.yml中配置日志输出

 
 
 

我们发现,它自动帮我们生成id了 1530399347068370946(Long)

 

数据库插入的id的默认值为:全局的唯一id,我们需要看它的主键生成策略

 

对应数据库中的主键:uuid、自增id、雪花算法、redis、zookeeper

而Mybatisplus就是用了雪花算法

分布式系统唯一id生成

https://blog.csdn.net/qq_37469055/article/details/118061067

雪花算法

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。
这个算法单机每秒内理论上最多可以生成1000*(2^12),也就是409.6万个ID。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FstiFPtG-1653734436950)(D:Typora DataMybatisPlus.assets1653711028311.png)]

雪花算法描述

  • 最高位是符号位,始终为0,不可用。

  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。

  • 10位的机器标识,10位的长度最多支持部署1024个节点。10位器标识符一般是5位IDC+5位machine编号,唯一确定一台机器。

  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

  • 几乎可以保证全球唯一

我们需要配置主键自增

1、实体类字段加上@TableId(type = IdType.AUTO

2、数据库字段一定要是自增

 

注意:updateById参数是一个对象

并且,它可以通过自动拼接sql自动更新

创建时间、修改时间,这些操作一般都是自动化完成,我们不希望手动更新,阿里巴巴有明确的规定,所有的数据库表:gmt_create,gmt_modified,几乎所有的表都要配置上!而且需要自动化

方式一:数据库级别(工作中不允许你修改数据库

在表中新增字段gmt_create,gmt_modified

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtH1dyD6-1653734436951)(D:Typora DataMybatisPlus.assets1653712551477.png)]

实体类添加字段

 

方式二:代码级别

https://baomidou.com/pages/4c6bcf/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vdec3cmA-1653734436952)(D:Typora DataMybatisPlus.assets1653713747522.png)]

我们恢复原始设置

 

编写处理器处理实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzWztwmF-1653734436953)(D:Typora DataMybatisPlus.assets1653721288294.png)]

MyMetaObjectHandler

 
 

1、找不到mapper

由于我们的myabtisplus是可以不用编写mapper以及xml的,所以配置文件也不需要相应的配置

所以,很大可能是由于依赖冲突了,记住,mybatis和mybatisplus的依赖不能同时导入,否则会出现版本问题。

 

也不要使用最高版本,最高版本会有问题。

2、实体类id自增没有默认值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQG8YwBx-1653734436954)(D:Typora DataMybatisPlus.assets1653720238091.png)]

这是因为我们的数据库表中的id没有设置自动自增导致的。

在面试的过程中,我们经常会被问到乐观锁,对应的还有悲观锁,这个其实非常简单

  • 乐观锁:顾名思义十分乐观,它总是认为不会出现问题,无论做什么,它都不会去上锁,如果出现问题,就再次更新值测试
  • 悲观锁:十分悲观,它认为总是会出现问题,无论做什么,都会上锁,再去操作
 

乐观锁实现方式

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对就更新失败

乐观锁:先查询,获取版本号version =1,更新的时候version+1再附带进去

什么意思呢

好比有两个人,同时执行更新操作,A比B更快完成了这个操作,那么这个时候B的version就不是1了,因为A先执行了这个操作,version=2≠1,所以B更新失败了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uG1Jv9zn-1653734436954)(D:Typora DataMybatisPlus.assets1653720801742.png)]

给数据库中增加version字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYe2gSWH-1653734436955)(D:Typora DataMybatisPlus.assets1653720934642.png)]

实体类添加对应的字段

 

注册组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9gJwyax-1653734436956)(D:Typora DataMybatisPlus.assets1653721267627.png)]

MyBatisPlusConfig

 

测试

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ZIbpBev-1653734436956)(D:Typora DataMybatisPlus.assets1653721609779.png)]

 

我们发现,它首先是先查询了信息包括version信息,然后要执行更新操作的时候,把version+1一同更新上去了。

现在,我们执行失败的情况

 

我们发现user1没有成功,我们也可以使用自旋锁赖重复提交,多线程一定要加锁

 
 

1、原始的limit进行分页

2、pageHelper第三方插件

3、MP内置分页插件

https://baomidou.com/pages/97710a/#%E5%B1%9E%E6%80%A7%E4%BB%8B%E7%BB%8D

配置分页插件

 

测试

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYaf20bu-1653734436958)(D:Typora DataMybatisPlus.assets1653723520187.png)]

删除操作跟查询的操作是一样的,这里就不讲了

我们这里讲讲逻辑删除

物理删除:从数据库中直接移除

逻辑删除:没有从数据库中移除,而是通过一个变量让他失效(你以为你注销了就没有你的信息了吗,不,只是你看不到了而已

逻辑删除是为了防止数据的丢失,类似于回收站

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dcyiFoq-1653734436959)(D:Typora DataMybatisPlus.assets1653723974562.png)]

默认0代表没有被删除,1代表被删除

 
 
 

logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)这一句的意思就是扫描全局的逻辑删除的实体字段名,我们上面用的是 deleted,所以我们可以把flag改成deleted,这样就不用写实体类了。

 

你以为删除了吗,其实只是执行了更新操作,记录依旧在数据库中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fk8eIg4i-1653734436960)(D:Typora DataMybatisPlus.assets1653724470010.png)]

但是查询的时候,会自动过滤被逻辑删除的对象,大大减少开发量。

十分重要,我们写一些复制的sql可以使用它来替代

AbstractWrapper

allEq

eq

ne

gt

ge

lt

le

between

notBetween

like

notLike

likeLeft

likeRight

isNull

isNotNull

in

notIn

inSql

notInSql

groupBy

orderByAsc

orderByDesc

orderBy

having

func

or

and

nested

apply

last

exists

notExists

QueryWrapper

select

UpdateWrapper

set

setSql

lambda

使用 Wrapper 自定义SQL

kotlin持久化对象定义最佳实践

用注解

用XML

kotlin使用wrapper

链式调用 lambda 式

 

其他的操作都根据官方文档来就行

MybatisX快速开发插件

#updatewrapper)

set

setSql

lambda

使用 Wrapper 自定义SQL

kotlin持久化对象定义最佳实践

用注解

用XML

kotlin使用wrapper

链式调用 lambda 式

 

其他的操作都根据官方文档来就行

最新文章
谷歌浏览器ipad版
谷歌浏览器ipad版是专门针对苹果ipad设备而开发的一款平板电脑浏览器,全新的外观融入了Material Design设计元素,图形更醒目、操作更流畅、触感更灵敏,能够带给用户流畅的上网体验。另外本款google chrome浏览器ipad版同时还具备网页翻译
连城网站排名优化费用是如何计算的?
连城目前的关键词排名方式有哪些?连城目前关键词排名主要分为竞价排名和自然排名。1、连城关键词自然排名,指的是通过各种搜索引擎优化(seo)方式,使您网站的关键词在搜索引擎自然排名中靠前。2、连城关键词竞价排名,通过对搜索引擎充
请问小红书如何设定推广目标以实现精准引流与品牌爆发?
小红书作为一个集社交、内容分享与电商于一体的平台,为品牌提供了广阔的营销空间。要实现精准引流与品牌爆发,设定明确的推广目标并制定相应的营销策略至关重要。以下是一份详细的小红书营销攻略:一、设定推广目标提升品牌知 名度:通过
百度推出惊雷算法:严厉打击快速排名,对SEO有什么影响?
百度资源搜索平台于11月20日零点发布惊雷算法通知,为什么选择这个时间节点,可能希望有一个全新的起点吧,另外一个原因站长们都是夜猫子,这个时间点,可能大家访问频率比较高。  还是言归正传,百度惊雷算法都说了什么?  百度搜索将于
颜姓股民向ST亚联发起索赔 章祥兵律师接受咨询
  12月16日消息,新浪股民维权平台今日收到颜姓股民针对(维权)的维权申请,目前该维权咨询已被章祥兵律师接受。新浪股民维权平台将关注该股民的索赔进程,相关维权持续征集中。  新浪股民维权平台目前有14名专业律师可代理该公司维权
超逼真美女写真生成:最强AI工具评测与实用攻略
5. DeepArt DeepArt是另一个输出高质量逼真图像的强大工具。它利用深度学习算法,将图片转化为艺术画作,风格多样,结果令人惊艳。尽管种类选择丰富,但其绘制时间相对较长,用户需要耐心等待。总的来说,各个工具各有优劣,用户可以根据个
谷歌商店国际服(Google Play 商店)
谷歌商店国际服免费下载,一款为玩家带来丰富多样紫云的手机应用商城。在这里,玩家动动手指即可搜索到自己感兴趣的。类型丰富,超多的资源实时推送,免费分享,一键即可下载畅玩。绿色安全,无广无毒,随时随地查看,乐趣满满。1、谷歌商
筑梦青春志在四方 规划启航职引未来——第二届全国大学生职业规划大赛成长赛道校内选拔总决赛圆满完成
2024筑梦青春志在四方规划启航职引未来为了增强我校学生职业规划意识,指导学生及早做好就业准备,以择业新观念打开就业新天地,促进高质量充分就业。2024年12月12日,我校举办了第二届全国大学生职业生涯规划大赛成长赛道校内选拔总决赛。
蜂鸟风神系统_雷神推出“蜂鸟屏”:为游戏玩家提供卓越视觉享受古代知名地点,今朝更名换姓,居然可以这样
如今的游戏本市场竞争激烈,各大品牌在硬件配置上的差异越来越小,甚至出现了严重的同质化现象为了在众多产品中脱颖而出,许多厂商开始从屏幕质量方面寻求突破一块优质的屏幕不仅能让玩家享受到更加流畅和细腻的视觉效果,还能显著提升整体
腾讯广告投放平台下载安装?腾讯广告投放平台助手
腾讯广告投放平台助手安装步骤及使用介绍摘要:腾讯广告投放平台助手是腾讯推出的一款帮助广告主快捷管理腾讯广告投放的工具。本文将为大家介绍如何下载安装腾讯广告投放平台助手,以及使用方法和注意事项。一、下载安装腾讯广告投放平台助
相关文章
推荐文章
发表评论
0评