MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
ActiveRecord
概述(摘自官网)
- ActiveRecord(简称 AR)一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于
ActiveRecord 往往只能感叹其优雅,所以我们也在 AR 道路上进行了一定的探索,喜欢大家能够喜欢。
什么是 ActiveRecord?
ActiveRecord 也属于 ORM(对象关系映射)层,由 Rails 最早提出,遵循标准的 ORM 模型:表映射到记录,记
录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而
且简洁易懂。ActiveRecord 的主要思想是:
每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的 Field;
ActiveRecord 同时负责把自己持久化,在 ActiveRecord 中封装了对数据库的访问,即 CURD;
ActiveRecord 是一种领域模型(Domain Model),封装了部分业务逻辑;
开启 AR 之旅
在 MyBatisPlus 中,开启 AR 非常简单,只需要实体对象继承Model
即可,同时还需要重写pkVal
方法,并返回主键。
实体对象:
1 | package com.itjing.entity; |
UserMapper.java
1 | /** |
注意:UserMapper 不能删除。
根据主键查询
1 |
|
新增数据
1 |
|
更新数据
1 |
|
删除数据
1 |
|
根据条件查询数据
1 |
|
Mybatis Plus 的插件
mybatis 的插件机制
mybatis 允许我们在已映射语句执行过程中的某一点进行拦截调用。默认情况下,Mybatis 允许使用插件来拦截的方法调用包括:
1 | Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) |
1 | ParameterHandler (getParameterObject, setParameters) |
1 | ResultSetHandler (handleResultSets, handleOutputParameters) |
1 | StatementHandler (prepare, parameterize, batch, update, query) |
我们可以看到可以拦截 Executor 接口的部分方法,比如 update、query、commit、rollback 等方法,还有其他接口的一些方法等。
总体概况为:
- 拦截执行器的方法。
- 拦截参数的处理。
- 拦截结果集的处理。
- 拦截 Sql 语法构建的处理。
示例:
① 自定义拦截器
1 | package com.itjing.plugins; |
② 注册到 Spring 的容器中:
1 | package com.itjing.config; |
防止全表更新与删除插件
在 MyBatisPlus 中提供了防止全表更新与删除插件。
① 配置防止全表更新与删除的插件
1 | package com.itjing.config; |
如果对全表更新或者删除,则会报异常。
乐观锁插件
主要适用场景
当要更新一条记录的时候,希望这条记录没有被别人更新。
乐观锁实现方式:
- ① 取出记录时,获取当前 version。
- ② 更新时,带上这个 version。
- ③ 执行更新时,
set version = newVersion where version = oldVersion
。
- ③ 执行更新时,
- ④ 如果 version 不对,就更新失败。
插件配置
乐观锁配置:
1 | package com.itjing.config; |
注解实体字段
① 修改表,添加version
字段,并且设置初始值为 1。
1 | ALTER TABLE `tb_user` ADD COLUMN `version` INT DEFAULT 1; |
② 为 User 实体对象添加version
字段,并且添加@Version
注解。
1 |
|
测试
1 |
|
特别说明
支持的数据类型只有:int、Integer、long、Long、Date、Timestamp、LocalDateTime。
整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中仅支持
updateById(id)
与update(entity, wrapper)
方法在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
自动填充
概述
有些时候,我们可能会有这样的需求,插入或更新数据的时候,希望有些字段可以自动填充数据。
比如:创建时间、修改时间等。在 MyBatisPlus 中提供了这样的功能,可能实现自动填充。
添加@TableField 注解
User.java
1 |
|
sql 脚本:
1 | ALTER TABLE `tb_user` ADD COLUMN `create_time` timestamp NULL ; |
FieldFill 提供了多种模式选择:
1 | public enum FieldFill { |
自定义 MetaObjectHandler
1 | package com.itjing.config; |
但是一般在设计数据库创建时间和修改时间的时候,我们这样做:
1 | -- 添加 创建 更新 时间字段 |
这样在新增和修改的时候,数据库会自动更新相应的值,就不需要配置上面的自动填充了。
逻辑删除
概述
开发系统的时候,有时候在实现功能的时候,删除操作需要实现逻辑删除,所谓的逻辑删除就是将数据标记为删除,而非真正的物理删除(非 delete 操作),其实是个修改操作。
查询的时候需要携带状态条件,确保被标记删除的数据不被查询到,这样做的目的就是为了避免数据被真正的删除。
修改表结构
为tb_user
表添加deleted
字段,用于表示数据是否被删除,1 代表删除,0 代表未删除。
1 | ALTER TABLE `tb_user` ADD COLUMN `deleted` INT ( 1 ) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER `version`; |
修改 User 实体,增加 deleted 属性,并添加@TableLogic 注解。
1 |
|
配置
1 | # MybatisPlus 配置 |
通用枚举
概述
解决了繁琐的配置,让 mybatis 优雅的使用枚举属性!
修改表结构
1 | ALTER TABLE `tb_user` |
定义枚举
1 | package com.itjing.enu; |
配置
1 | # MybatisPlus 配置 |
修改实体
1 | package com.itjing.entity; |
测试
1 |
|
代码生成器
概述
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
依赖
pom.xml
1 | <!-- mybatis-plus-generator --> |
生成器代码
1 | package com.itjing.generator; |
生成后可以看到,生成的业务层中封装了许多操作数据库的方法。
如果这些方法都不能满足你的需求,你还可以编写 mapper 映射文件、mapper 接口方法进行拓展。
发布时间: 2021-12-08
最后更新: 2024-06-24
本文标题: MyBatisPlus高级
本文链接: https://blog-yilia.xiaojingge.com/posts/d1dd6036.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
