黑马SpringCloud-day01-MybatisPlus-个人笔记

Mybatis-plus

一. 约定

  1. 类名(驼峰转下划线)作表名
  2. id作主键
  3. 变量名(驼峰转下划线)转字段名

二. 自定义配置

1.@TableName(“tb_user”)

指定表名
2.@TableId(value=“id”,type=“策略”)

type:

  • AUTO: 数据库自增长
  • INPUT: 通过set方法自行输入
  • ASSIGN_ID: 全局唯一ID生成器 默认为雪花算法

3.@TableField(“name”)

场景:

  • 变量名与数据库字段名不一致
  • boolean isXXX 自动转为 xxx
  • order 与数据库字段名冲突 @TableField(value=“order”)
  • 需要忽略的字段 @TableField(exist=false)

三. MP常用配置

mybatis-plus:
  type-aliases-package: com.ithema.mp-app.domain.po # 扫描实体类所在包
  mapper-locations: "classpath*:mapper/**/*.xml" # *mapper.xml文件所在路径
  configuration:
    map-underscore-to-camel-case: true # *是否开启驼峰转下划线
    cache-enabled: false # *是否开启二级缓存
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID # 雪花
      table-underline: true 
      capital-mode: true 
      logic-delete-value: 1 

四.核心功能

1. 条件构造器(Wrapper)
classDiagram
Wrapper <-- AbstractWrapper
AbstractWrapper <-- AbstractLambdaWrapper
AbstractWrapper <-- UpdateWrapper
AbstractWrapper <-- QueryWrapper
AbstractLambdaWrapper <-- LambdaUpdateWrapper
AbstractLambdaWrapper <-- LambdaQueryWrapper

note for AbstractWrapper "基础条件构造器"
note for QueryWrapper "选择要查询的字段"
note for UpdateWrapper "setSql"
note for AbstractLambdaWrapper "硬编码的字段改成get方法函数如User::getName"

Lombok @Data 和 @Builder同时使用时,@Builder注解会覆盖@Data注解的作用,导致生成的POJO没有默认构造函数,需要手动添加。
@NoArgsConstructor 和 @AllArgsConstructor

2. 自定义SQL(使用MP生成复杂WHERE条件)
  1. IMapper层
    customSelect(@Param(“ew”) QueryWrapper queryWrapper, @Param(“field”) String field)
  2. Service层
    customSelect(new QueryWrapper().lambda()
    .in(User::getId, Arrays.asList(1, 2, 3)),)
  3. xml文件
    <…> … ${ew.customSqlSegment}
3. IService接口
IService
ITService
TServiceImpl
ServiceImpl
  • lambda
    • lambdaQuery()
    • lambdaUpdate()

      set(Condition,field,value)
4. 批处理

mysql驱动配置,拼接到url后面
rewriteBatchedStatements=true

  • 测试:
    • 10万条for循环插入耗时: 105417ms
    • 10万条batch插入耗时: 3297ms

五. 拓展功能

1. mybatis插件生成代码
2. Db静态工具类

避免循环依赖

批量嵌套查询思路只做两次批量查询

  • 先查询出所有User users
  • 再查出所有Address addresses
  • 使用stream collector.groupingBy(User::getId)分组
  • for循环遍历users 装配userVOs 填入address
3. 逻辑删除
  • 实体类,表结构添加逻辑删除字段 deleted
  • 配置全局逻辑删除值
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  • 存在的问题

    1. 会导致数据库表中垃圾数据越来越多,影响查询效率

    2. 每次查询都需要判断是否为逻辑删除,影响查询效率
  • 解决方案

    不用逻辑删除,可以在物理删除前,将数据迁移到其它表中
4. 枚举处理
  • 配置mp configuration的枚举类型处理器为com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
  • 定义枚举类 使用@EnumValue注解,使用枚举作为变量类型
  • 使用@JsonValue 说明返回该类型时 返回的值为哪个字段
@Getter
public enum UserStatus {
    NORMAL(0, "正常"),
    NORMAL2(1, "正常"),
    LOCKED(2, "锁定"),
    ;

    @EnumValue
    private final int value;
    @JsonValue
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}
5. JSON处理


用于对象中嵌套JSON对象

  • @Table(…,autoResultMap=true) 使用自动结果映射
  • @TableField(typeHandler=JsonTypeHandler.class) 指定JSON类型处理器

六.插件功能

分页插件(orderBy)
  • 配置MybatisPlusInterceptor拦截器
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
  // 可以对分页拦截器进行相关配置
  paginationInnerInterceptor.setOverflow(false);
  paginationInnerInterceptor.setMaxLimit(1000);
  // 添加到拦截器
  interceptor.addInnerInterceptor(paginationInnerInterceptor);
  return interceptor;
}
  • 使用
Page<User> page = Page.of(1, 10);//设置分页
page.addOrder(OrderItem.desc("id"));//设置排序
service.page(page);
// 查询后结果会保存到page中
// 解析page...

封装PageQueryPageVO对象,进行对象拷贝及数据处理

封装 PageQuery和PageQuery.toMpPage(OrderItem… items)

拷贝 分页参数 并进行 排序配置

pageQuery
+ Integer pageNo
+ Integer pageSize
+ String sortBy
+ Boolean isAsc=true
+toMpPage()
UserPageQuery
AddressPageQuery
  /*
  * @param items 排序字段 //new OrderItem("updated_at")
  */ 
  public <T> Page<T> toMpPage(OrderItem ... items) {
      //拷贝分页
      Page<T> page = new Page<>(pageNo, pageSize);
      //设置排序
       if (StringUtils.isNotBlank(sortBy)) {
          page.addOrder(isAsc? OrderItem.asc(sortBy) : OrderItem.desc(sortBy));
      }else if(items){
          page.addOrder(items);//支持可变参数
      }
      return page;
  }

同理 封装PageVO,和PageVO.of(Page)

拷贝结果 + 数据处理(如用户名只显示前两个字 Ja***, Sp***)

你可能感兴趣的:(spring,cloud,笔记,spring)