简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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、快速入门体验
地址:https://baomidou.com/guide/quick-start.html
使用第三方组件:
- 使用对应的依赖;
- 如何搞定依赖的配置;
- 代码怎么写
步骤
1、创建数据库mybatis_plus
2、创建表user
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
在真实的开发过程中,除了以上的字段,version(乐观锁)、deleted(逻辑删除)、gmt_create(创建时间)、gmt_modified(修改时间)这些字段也是必要的。
3、使用springboot初始化项目
4、导入依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
5、连接数据库
mysql5连接驱动不需要时区
mysql8连接驱动配置
6、dao(mapper)-service-controller
User实体类
最重要的部分就是继承BaseMapper父类,可以不用写通用的CRUD
配置包扫描路径
测试接口
查询结果
3、配置日志输出
日志的作用是什么?为什么需要使用日志?
sql语句是不可见的,因此需要到日志中查看。
mybatis-plus日志配置
日志输出
4、插入测试和雪花算法
CRUD拓展
插入测试
id是自动生成的,result返回结果是受影响的行数。
插入结果
主键生成策略
对应数据库中的主键(uuid、自增id、雪花算法、redis、 zookeeper
分布式系统唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
主键自增
其他源码解释
6、更新操作
updateById的参数是一个对象
自动拼接动态sql
自动填充
创建时间、修改时间!这些个操作一遍都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册︰所有的数据库表:gmt_create、 gmt_modified几乎所有的表都要配置上!而且需要自动化!
方式一:数据库级别
1、添加创建时间和修改时间,默认值是当前时间CURRENT_TIMESTAMP
2、实体类中添加字段
3、再次更新查看结果即可
方式二:代码级别
1、删除数据库的默认值和跟新操作
2、在实体类字段属性上添加内容
3、编写处理器Handler来处理这个注解
首先需要继承元数据处理器MetaObjectHandler,然后重写插入填充和修改填充方法。
3、测试插入,发现所有时间全部填充成功。
4、测试更新,发现只有修改的那行更新时间发生变化。
8、乐观锁处理讲解
乐观锁:故名思义十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,再次更新值测试。(会使用一个版本号version)。
悲观锁:故名思义十分悲观,它总是认为总是出现问题,无论千什么都会上锁!再去操作!
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
MP中乐观锁的测试
1、增加version字段
2、实体类添加对应的字段
3、编写MybatisPlus的配置类
(1)将包扫描注解转移到这里
(2)添加开启事务管理的注解
(3)注册乐观锁插件
乐观锁成功案例
乐观锁失败案例
9、查询操作
批量查询
条件查询,自动拼接
10、分页查询
1、数据库使用limit分页;
2、PageHelper第三方插件分页;
3、MP自带分页插件。
如何使用MP的分页插件
1、配置拦截器
2、测试分页功能
11、删除操作
通过map删除
12、逻辑删除
逻辑删除:通过一个变量来让他失效,deleted=0==>deleted=1
物理删除:直接从数据库中删除数据
管理员可以查看被删除的记录,类似于回收站。
配置逻辑删除组件
逻辑删除为1,逻辑未删除为0
逻辑删除使用的是更新操作,不是删除操作
13、性能分析插件
1、导入插件
需要在SpringBoot配置环境为dev
2、测试使用
设置100ms超时,超过100ms就会抛出异常,可以筛选出速度慢的sql,用于优化提升。
14、条件查询Wapper
做一些复杂的条件查询可以使用QueryWapper<User>
条件甚至可以写成子查询