业界动态
MybatisPlus入门使用
2024-10-31 20:09

官网:http://mp.baomidou.com/

MybatisPlus入门使用

参考教程:http://mp.baomidou.com/guide/

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

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

1、使用步骤

(1)引入依赖

spring-boot-starter、spring-boot-starter-test

添加:mybatis-plus-boot-starter、MySQL、lombok、

在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的编写

注意引入 之后请不要再次引入 以及 ,以避免因版本差异导致的问题。

使用lombok的时候,idea中要安装lombok的插件

(2)配置数据源

在 配置文件中添加 MySQL 数据库的相关配置

mysql5

mysql8以上(spring boot 2.1

**注意:**driver和url的变化

  • 这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为Spring Boot 2.1 集成了 8.0版本的jdbc驱动,这个版本的 jdbc 驱动需要添加这个后缀,否则运行测试用例报告如下错误:(时区的设置)

java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more

  • 这里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建议使用这个驱动,之前的 com.mysql.jdbc.Driver 已经被废弃,否则运行测试用例的时候会有 WARN 信息
(3)实体类的创建

(4)mapper的创建(持久层

创建包 mapper 编写Mapper 接口

baseMapper中封装了一些简单的方法,我们继承之后调用即可

IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。

为了避免报错,可以在 dao 层 的接口上添加 @Repository 注解

(5)配置日志

这个使用之后就可以不用日志文件的配置了,在控制台就会出现SQL语句的执行以及数据的显示过程

2、使用好处

使用它的时候,我们使用简单的CRUD的时候就不需要书写SQL语句,框架就给我们封装好了,在遇到复杂的业务,使用复杂的SQL语句时,我们配置

1、主键策略

(1)ID_WORKER

MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID

参考资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html

2、自增策略

  • 要想主键自增需要配置如下主键策略

    • 需要在创建数据表的时候设置主键自增
    • 实体字段中配置 @TableId(type = IdType.AUTO)

要想影响所有实体的配置,可以设置全局主键配置

3、其它主键策略

分析 IdType 源码可知

4、总结主键策略

主键生成策略

(1)主键自动增长

(2)UUID

(3)Redis实现生成

(4)mp自带策略(生成一个19位的id值

在实体类id属性添加注解配置策略

@TableId(type = IdType.ID_WORKER)

(1)AUTO:自增长

(2)INPUT:手动输入id值

(3)UUID:生成uuid值

(4)NONE:没有策略

(5)ID_WORKER:mp自带策略

  • 如果实体类id属性是数字类型Long,使用这个策略

(6)ID_WORKER_STR:mp自带策略

  • 如果实体类id属性是字符串类型,使用这个策略

5、自动填充

1、不需要set添加值,使用mp方式实现添加操作

2、向user表添加两个字段 create_time update_time

在这里插入图片描述

3、user表对应实体类添加两个属性
在这里插入图片描述
4、在属性上加上注解

5、书写自动填充的类

6、总结使用步骤

(1)在需要自动填充的属性上添加注解@TableFilled

(2)书写自动填充类

(3)在填充类上添加注入IOC容器的注解@Compontent就行

6、实现乐观锁

主要适用场景: 当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新时, set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

    乐观锁一种问题解决丢失更新的方案

    在这里插入图片描述

(1)数据库中添加version字段

在这里插入图片描述

(2)数据库中添加version字段

并添加 @Version 注解

(3)元对象处理器接口添加version的insert默认值

特别说明:

  • 支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime

  • 整数类型下 newVersion = oldVersion + 1

  • newVersion 会回写到 entity 中

  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法

  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

(4)在 MybatisPlusConfig 中注册 Bean
(5)测试成功
(6)总结乐观锁的使用步骤

第一步 表添加版本号字段,对应实体类添加版本号属性

第二步 在实体类版本号属性上面添加注解 @Version

第三步 配置乐观锁插件

7、CRUD操作

(1)查询
  • 根据id查询

     
  • 批量查询

     
  • 简单条件查询

     
  • 分页查询

     
  • 多条件查询

    多条件查询需要用到的类结构体系图

    在这里插入图片描述

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

    上图中一般经常使用的是QueryWrapper这个类

    
    	
    1. ge gt le lt: >= > <= <

    2. eq ne= !=

    3. between: 区间范围值

    4. like:模糊查询

    5. orderByDesc orderByAsc : 排序

    6. select:查询指定的列

    7. ge、gt、le、lt、isNull、isNotNull

    8. eq、ne

    9. between、notBetween

    10. allEq

    11. like、notLike、likeLeft、likeRight

    12. in、notIn、inSql、notinSql、exists、notExists inSql、notinSql:可以实现子查询

    13. or、and
      注意:这里使用的是 UpdateWrapper
      不调用or则默认为使用 and 连

    14. 嵌套or、嵌套and
      这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号

    15. orderBy、orderByDesc、orderByAsc

    16. last
      直接拼接到 sql 的最后
      注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用

    17. 指定要查询的列

       

      SELECT id,name,age FROM user WHERe deleted=0

    18. set、setSql
      最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段

       

      UPDATE user SET age=?, update_time=?, name=?, email = ‘123@qq.com’ WHERe deleted=0 AND name LIKE ?

  • 多条件分页查询

     

    在这里插入图片描述

(2)添加

添加时候,没有设置id值,添加之后在表生成一个19位的id值MybatisPlus使用的是id自增长策略

在这里插入图片描述

(3)修改
(4)删除
最新新闻
“撒旦”人血鞋?碰瓷新疆棉花的耐克,又开始喊冤了?
继主动碰瓷新疆棉花把自己搞得股价大跌之后耐克秉承着“no zuo no die”的精神又开始暗搓搓搞“阴间操作”限量发售含人血的“撒
tiktok怎么搭建外网 详细教程及步骤
TikTok怎么搭建外网(详细教程及步骤)TikTok是一款非常流行的短视频社交应用程序,它在全球范围内拥有数亿用户。在使用TikTok的
《以案释法》步数越多,收益越高?别被“走路也能赚钱”的理财广告忽悠了
  走路也能赚到钱的理财  “丑的人还在睡觉,美的人已经跑出一杯星巴克了。”2016年的一天,一个女孩晒出的朋友圈截图引起了
如何用生意参谋算出同行店铺真实销售额
怎么经过生意顾问算出同行店肆实在销售额?大多数在淘宝天猫工作过的人都知道,他们的背景显现了同行商铺的买卖数据,这被称为买
一款最近比较火的网站统计分析系统,易分析具有什么样的功能呢?
一、产品简介北京普艾斯科技有限公司成立于2009年,服务客户1000+,包括电商、金融、保险、政务服务等行业。私有化部署,全渠道
向佐快乐大本营2024年精彩回顾:四年时光共欢笑
张大大谢娜力捧下的综艺新星张大大一位在娱乐圈中颇具人气的主持人他的成名之路离不开谢娜的提携回顾张大大的成名之路可以说谢娜
PingTools app
《PingTools app》是一款非常好用的实用工具软件,软件内拥有丰富的功能,包含了包括浏览器扫描等。使用非常简单,直接下载安装
抖音能看到谁搜索过自己吗?
尊敬的用户,您好。针对抖音平台是否能够查看谁搜索过自己的问题,我们需要做一些详细说明。首先,根据我们了解到的情况,在抖音
什么是人工智能“语料库”?为什么每个人都在谈论它?
编者按:比尔盖茨(Bill Gates)、Reddit 首席执行官和其他科技领袖越来越多地谈论“语料库”,现在是时候了解它是“何方神圣”
LED行业词语中英对应
1、led 灯具构成英文led 球泡灯:led bulbLed 贴片灯珠:SMD LEDLed驱动电源:led driver隔离电源:isolated driver非隔离电源:
本企业新闻

点击拨打: