MyBatis-Plus笔记
1. MP入门
1.1 MP第一个案例
第一步:导入依赖(MP、Lombok、MySQL)。
第二步:配置 application.yml 数据库四项。
第三步:编写业务逻辑类:POJO 类、Mapper 接口 extends BaseMapper。
第四步:通常是 service 注入 Mapper 接口的代理类对象。
1.2 MP常用注解
@TableName(value=“表名”):类名和表名不一致时使用,value 值为表名。
@TableId(Value=“主键”,type=IdType.XXX):主键 id,value 值为数据库表中的id值。type 为主键生成策略。
@TableField(value = “”, exit=fasle, fill = FieldFill.INSERT):exit 为 fasle 时,表示数据库表中没有该字段,fill 属性表示新增或修改自动赋值。
@TableLogic:逻辑删除。
@version:版本号,先查询后修改,版本号自动递增,不需要手动修改。
1.3 下划线转驼峰式命名
下划线转驼峰式命名,查询时有影响,返回时的映射也有影响
默认开启,关闭操作如下:
mybatis-plus:
configuration:
map-underscore-to-camel-case: false #关闭下划线转驼峰式命名互转
1.4 查询SQL语句日志的两种方式
-
Spring 自带的方式
# 第一种方案:全局debug #logging: # level: # root: debug # 第二种方案:局部目标文件debug logging: level: com.xxx.mp.mapper: debug
-
使用 MP 提供的方式
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2. MP的增删改查
2.1 增
主键生成
5种常见的主键生成策略:
- NONE(1):默认的 mp 主键生成策略,mybatis-plus 会使用雪花算法(snowflake)生成19位的数值类型递增的唯一标识符。[MP推荐]
- INPUT(2):要让用户自己输入主键。
- AUTO(0):表示使用数据库表的自增主键,要求:表的列是数值类型,列是递增的。
- ASSIGN_ID(3):表示如果用户自己输入例如 id,就用用户自己输入的id作为主键,如果没有指定,就用默认的mp主键生成策略。
- ASSIGN_UUID(4):表示如果用户自己输入例如 UUID,就用用户自己输入的 UUID 作为主键,如果没有指定,就用mp帮我们生成 UUID 作为主键。
2.2 删
根据 id、ids、map、wrapper 删除
2.3 改
直接修改:MP 支持直接通过 id 修改,updateById()。
自动填充两步走:
1. 在自动填充的属性上添加 @TableField 注解,指定 fill=fieldType.INSERT,指定填充时机。
1. 自定义类实现 MetaObjectHandler 接口,新增 、修改 this.setFieldValByName(),指定填充什么值。
逻辑删除:
- 局部配置:@TableLogic
- 全局配置:
# 逻辑删除,全局配置 mybatis-plus: global-config: db-config: logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) logic-delete-field: deleted #全局逻辑删除的实体字段名(since 3.3.0,配置后可以不配置@deleted)
乐观锁三步走:实现高性能并发又可保证数据的安全性
- @Version
- 乐观锁插件
- 先查询出来、修改、写回去
2.4 查
普通查询:selectById()、selectBatchIds()、selectList()、selectByMap()、selectOne()、selectCount()等。
分页查询:selectPage(),分页查询参数对象与查询后接受的对象底层是同一个对象,所以不用接受,直接使用参数对象。
2.5 Wrapper查询
3. 补充
3.1 持久层自定义方法和SQL
3.2 遍历集合的几种方式
- 增强 for
- 普通 for
- 迭代器
- stream 流
3.3 自定义 service 层
- service 接口 继承 IService 接口。
- service 接口实现类继承 service 接口并继承 ServiceImpl 类,第一个参数为对应的 Mapper,第二参数为 POJO 类。【实现类记得注入容器】。
- xxxService 调用 xxxMapper 可以直接调用 baseMapper。调用其他 Mapper 需要手动注入。
3.4 时区问题
MySQL8.0 数据库配置
spring:
datasource:
username: xxx
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://xxx:3306/xxx?serverTimezone=Asia/Shanghai