Java Web|day6.MyBatis-Plus

君君超有趣 2024-08-23 14:33:01 阅读 52

MyBatisPlus

定义

mybatis-plus是一款Mybatis增强工具,用于简化开发,提高效率。

核心功能

注解

@TableName

注解在类上,指定类和数据库表的映射关系。实体类的类名(转成小写后)和数据库表名相同时,可以不指定该注解。

@TableId

注解在实体类的某一字段上,表示这个字段对应数据库表的主键。

@TableField

注解在某一字段上,指定Java实体类的字段和数据库表的列的映射关系。

@Version

乐观锁注解

@EnumValue

注解在枚举字段上

@TableLogic

逻辑删除

KeySequence

序列主键策略

InterceptorIgnore

插件过滤规则

CRUD接口

mp封装了一些最基础的CRUD方法,只需要直接继承mp提供的接口,无需编写任何SQL,即可食用。mp提供了两套接口,分别是Mapper CRUD接口和Service CRUD接口。并且mp还提供了条件构造器Wrapper,可以方便地组装SQL语句中的WHERE条件

Mapper CRUD

只需定义好实体类,然后创建一个接口,继承mp提供的BaseMapper,即可食用。mp会在mybatis启动时,自动解析实体类和表的映射关系,并注入带有通用CRUD方法的mapper。

Service CRUD

另外一套CRUD是Service层的,只需要编写一个接口,继承IService,并创建一个接口实现类,即可食用。(这个接口提供的CRUD方法,和Mapper接口提供的功能大同小异,比较明显的区别在于IService支持了更多的批量化操作,如saveBatch,saveOrUpdateBatch等方法。

使用方法

首先,新建一个接口,继承IService创建这个接口的实现类,并继承ServiceImpl,最后打上@Service注解,注册到Spring容器中,即可食用@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }

条件构造器

而QueryWrapper针对SELECT语句,提供了select()方法,可自定义需要查询的列,而UpdateWrapper针对UPDATE语句,提供了set()方法,用于构造set语句。

Condition 条件构造器的诸多方法中,均可以指定一个boolean类型的参数condition,用来决定该条件是否加入最后生成的WHERE语句中

自定义SQL

条件构造器

注解上编写sql语句

分页查询

AR模式

定义

ActiveRecord模式,通过操作实体对象,直接操作数据库表。

使用过程

让实体类User继承自Model

<code>public class User extends Model<User>

直接调用实体对象上的方法

boolean success = user.insert(); // 插入

主键策略

定义

在定义实体类时,用@TableId指定主键,而其type属性,可以指定主键策略。

种类

AUTO

数据库ID自增,依赖于数据库。在插入操作生成SQL语句时,不会插入主键这一列

NONE

未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID)

INPUT

需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。

ASSIGN_ID

当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法

ASSIGN_UUID

当实体类的主键属性为空时,才会自动填充,使用UUID

逻辑删除

定义

逻辑删除是为了方便数据恢复,和保护数据本身价值的一种方案。

步骤

application.yml中配置

mybatis-plus:

global-config:

db-config:

logic-delete-field: deleted # 全局逻辑删除的实体字段名

logic-delete-value: 1 # 逻辑已删除值(默认为1)

logic-not-delete-value: 0 # 逻辑未删除值(默认为0)

# 若逻辑已删除和未删除的值和默认值一样,则可以不配置这2项

对sql的影响

INSERT语句:没有影响SELECT语句:追加WHERE条件,过滤掉已删除的数据UPDATE语句:追加WHERE条件,防止更新到已删除的数据DELETE语句:转变为UPDATE语句

自动填充

定义

mp可以通过配置,对某些字段进行自动填充,例如’新增时间’,‘修改时间’,'操作人’等等

步骤

在实体类中的某些字段上,通过@TableField设置自动填充

@TableField(fill = FieldFill.INSERT) // 插入时自动填充

private LocalDateTime createTime;

@TableField(fill = FieldFill.UPDATE) // 更新时自动填充

private LocalDateTime updateTime;

实现自动填充处理器

在这里插入图片描述

乐观锁插件

定义

当出现并发操作时,需要确保各个用户对数据的操作不产生冲突,此时需要一种并发控制手段。而乐观锁,正如其名,它先假设不存在冲突情况,而在实际进行数据操作时,再检查是否冲突。乐观锁的一种通常实现是版本号,在MySQL中也有名为MVCC的基于版本号的并发事务控制。

适用场景

在读多写少的场景下,乐观锁比较适用,能够减少加锁操作导致的性能开销,提高系统吞吐量。

在写多读少的场景下,悲观锁比较使用,否则会因为乐观锁不断失败重试,反而导致性能下降。

原理

取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果oldVersion与数据库中的version不一致,就更新失败

步骤

配置乐观锁插件

<code>@Configuration

public class MybatisPlusConfig {

/** 3.4.0以后的mp版本,推荐用如下的配置方式 **/

@Bean

public MybatisPlusInterceptor mybatisPlusInterceptor() {

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

return interceptor;

}

}

在实体类中表示版本的字段上添加注解@Version

@Version

private Integer version;

使用

在这里插入图片描述

注意

实体类中version字段,类型只支持int,long,Date,Timestamp,LocalDateTime乐观锁插件仅支持updateById(id)与update(entity, wrapper)方法如果使用wrapper,则wrapper不能复用

性能分析插件

该插件会输出SQL语句的执行时间,以便做SQL语句的性能分析和调优。

动态表名SQL解析器

定义

数据量特别大的时候,我们通常会采用分库分表。这时,可能就会有多张表,其表结构相同,但表名不同。例如order_1,order_2,order_3,查询时,我们可能需要动态设置要查的表名。

步骤

配置动态表名拦截器

在这里插入图片描述

测试

<code>@Test

public void testDynamicTable() {

user2Mapper.selectList(null);

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。