分享好友 最新动态首页 最新动态分类 切换频道
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 式

 

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

最新文章
《明日方舟:终末地》再次测试招募开启 公布全新PV
今天(2024 年 12 月 14 日),塔防手游《明日方舟》开发商鹰角网络发布了此前宣布的即时策略游戏《明日方舟:终末地》的“再次测试”PV,并宣布测试招募现已开启。游戏的“再次测试”B测将于 2025 年 1 月中旬开启,为限量删档测试,将不
直通车推广技巧:选词、出价、优化,提高ROI
作为一名资深的电商运营人员,我深知直通车推广在提升店铺流量和销量方面的重要性。很多新手卖家在操作直通车时往往会陷入一些误区,导致ROI偏低,甚至亏损。为了帮助大家更好地理解直通车推广的精髓,我将从选词、出价、优化三个方面来分
行业视角 | 哈尔滨骏展雷克萨斯总经理董占全:探秘黑龙江最大雷克萨斯店,人效与服务的博弈!
我们集团在整个黑龙江省有9家店,其中有7家是在哈尔滨,有两家是在整个黑龙江省外的,整个集团一共是9家店。那我们骏展雷克萨斯可以这么讲,是整个黑龙江省建筑面积是最大的一个雷克萨斯的经销商店。那整个建地面积是15,000平,建筑面积的
抖音开通膳食营养类目准备什么资料?开通具体步骤分享 今年快速渠道
在数字经济飞速发展的今天,短视频平台已经成为了各类品牌宣传、产品推广的重要渠道。抖音作为国内Zui受欢迎的短视频平台之一,凭借其强大的用户基数和丰富的内容生态,吸引了无数企业和个人入驻。如果你打算在抖音上开通膳食营养类目账号
用尖端科技赋能低空城市起降场数智运行
转自:天津日报  “忽如一夜春风来,千树万树梨花开”。低空经济作为战略性新兴产业融合发展的新赛道,已成为推动社会经济创新发展的新引擎。城市起降场作为低空经济的主要基础设施之一,其数智运行程度直接影响了低空经济的整体运行水平
详解人工智能领域重大突破:GPT-3
英语原文:Exploring GPT-3: A New Breakthrough in Language Generation翻译:雷锋字幕组GPT-3是什么?我们讨论15亿参数的 Generative Pretrained Transformer-2(GPT-2)的延迟发布是否合理,似乎还是去年的事情。如果你觉得其实没过多久
,掌握这些技巧,让百度轻松收录你的网站内容
在当今数字化时代,拥有一个网站对于个人和企业来说至关重要,仅仅拥有一个网站是不够的,更重要的是让百度等搜索引擎收录你的网站内容,以便更多的人能够找到你的网站,怎样才能让百度收录网站内容显示呢?下面将为大家介绍一些实用的技巧
谷歌chrome浏览器2023安卓最新
谷歌chrome浏览器是一款快速、安全且功能丰富的网络浏览器,干净整洁的界面以及快速地浏览速度带给用户舒适的使用体验,多功能的特点使用户可以畅快的浏览互联网、享受便捷的上网体验。网页翻译 - 您可以轻松浏览任何语言的网页节省数据流
这些A股光存储概念股名单,你需要知道!(12月12日)
  据南方财富网概念查询工具数据显示,相关光存储概念股:  1、中电兴发002298:12月12日消息,中电兴发5日内股价上涨13.23%,该股最新报6.880元涨3.28%,成交7.58亿元,换手率16.78%。  公司于2020年2月19日晚间披露2019年度非公开
都江堰seo优化价格【百度都江堰】
文章都江堰seo优化价格【百度都江堰】由网友旧时月色投稿,希望给你工作学习带来帮助。在当今数字化时代,搜索引擎优化(SEO)对于企业和个人的在线存在至关重要,都江堰作为一个充满活力和发展潜力的城市,也有许多企业和个人希望通过 SEO
相关文章
推荐文章
发表评论
0评