配置mybatisplus输出调试日志

  1. # 方式一
  2. mybatis-plus:
  3. configuration:
  4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  5. # 方式二 application.yml 中增加配置,指定 mapper 文件所在的包
  6. logging:
  7. level:
  8. com.baomidou.example.mapper: debug

主键生成策略

  • 分布式系统唯一 id生成策略 https://www.cnblogs.com/haoxinyue/p/5208136.html
  • 雪花算法
    • 推特开源的分布式id生成算法,结果是一个long形id,核心思想是 使用41bit作为毫秒数,10bit为机器id (5个bit是数据中心,个bit是机器的id)12bit为流水单号,最后还有一个符号位,永远为0,可以保证几乎全球唯一。 ```java // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //

package com.baomidou.mybatisplus.annotation;

public enum IdType { AUTO(0), // 自增策略 NONE(1), // 未设置逐渐 INPUT(2), // 手动输入 ASSIGN_ID(3), // ASSIGN_UUID(4),// 全局唯一id uuid / @deprecated */ @Deprecated ID_WORKER(3), // 默认全局唯一id生成规则 / @deprecated / @Deprecated ID_WORKER_STR(3), // i_worker 字符串输出 /** @deprecated / @Deprecated UUID(4);

  1. private final int key;
  2. private IdType(int key) {
  3. this.key = key;
  4. }
  5. public int getKey() {
  6. return this.key;
  7. }

}

<a name="1N79K"></a>
# 测试插入,更新

- mapper.insert(pojo)
- mapper.updateById(pojo)
<a name="5Lac9"></a>
# 自动填充

- 创建时间,修改时间,这些操作都是自动生成,不希望手动更新。
- 方式1: 数据库级别
   - 表中新增字段
   -  create_time 
   - update_time
- 方式2:代码级别
   - 删除数据库的默认值,更新操作
   - 实体类的字段属性上需要增加注解
```java
    // 插入的时候自动更新值打入数据库中
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    // 更新的时候自动更新值打入db
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTIme;
}

乐观锁

  • 面试过程中会呗经常问到乐观锁,悲观锁。
  • 乐观锁
    • 顾名思义,十分乐观,总是认为不会出现问题,无论干什么都不会去上锁,如果出现问题,,再次更新值时测试
    • version,new version
  • 悲观锁

    • 十分悲观,总是认为会出问题,无论干什么都会上锁,然后再进行操作

      主要讲解乐观锁

  • 实现方式

    • 取出记录时,获取当前version
    • 更新时,带上这个version
    • 执行更新时,set version = newVersion where version = oldversion
  • 乐观锁
    • 先查询,获得版本号 ```java — A 线程 update user set name = “addicated” version = version +1 where id = 2 and version =1

— B 线程 update user set name = “addicated” ,version = version +1 where id = 2 and version =1

<a name="DGoRh"></a>
## 测试一下mp的乐观锁插件

- 给数据库添加version字段 
- 实体类添加对应的字段
```java
    @Version  // 添加乐观锁注解
    private Integer version;
  • 注册组件 ```java @Configuration @EnableTransactionManagement public class MybatisPlusConfig {

// 注册乐观锁插件

@Bean
// 这是一个拦截器,会在所有操作发生时进行拦截
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
    return new OptimisticLockerInnerInterceptor();
}

}

<a name="LsJkq"></a>
# 分页查询

- 分页在网站使用十分之多
   - 原始的limit进行分页
   - pageHelper分页插件
   - mp也提供了分页插件
```java
package net.xdclass.config;


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

// 注册乐观锁插件

    @Bean
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }



    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }


}

使用

   public void  testPage(){


        // 参数 1 当前页
        // 参数 2 页面大小
        Page<Object> objectPage = new Page<>(1,5);
        // queryWrapper 为复杂查询条件
        userMapper.selectPage(objectPage, null);
        objectPage.getRecords().forEach(System.out::println);
    }

page 对象中封装了相当多的方法,可以方便取用
image.png

删除

  • 直接通过继承baseMapper的mapper接口类进行调用delete方法即可。
  • 通过map进行删除

    
      public  void  testDelte(){
          HashMap<String, Object> map = new HashMap<>();
          //  删除user中name为addicated的记录
          map.put("name","addicated");
          userMapper.deleteByMap(map);
      }
    

    逻辑删除

  • 在对应表中制定一个字段作为逻辑删除字段。

  • 在对应的实体类的逻辑删除字段上添加注解 @TableLogic
  • 配置逻辑删除 - 在application中添加相关的配置 ```java

    配置plus打印sql日志

    mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config:
    logic-delete-value: 1  // 删除的值
    logic-not-delete-value: 0   // 不删除的值
    
<a name="lMKR6"></a>
# 性能分析插件

- 平时开发过程中会遇到一些慢sql,
- MP也提供性能分析插件,如果超过这个时间就停止运行
   - 导入插件
   - 测试使用
- 作用 分析每条sql执行时间。
```java

// 该插件一般在开发的时候使用,在控制台进行报错提醒程序员进行优化。
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启  spring.profiles.active=dev 在application中配置环境信息
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(20);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

条件构造器 — 重点掌握

  • wrapper 十分重要,复杂的sql就可以使用wrapper来进行替代 ```java package net.xdclass.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.injector.methods.SelectList; import net.xdclass.model.UserDO; import org.springframework.beans.factory.annotation.Autowired;

public class MapperTest {

@Autowired
UserMapper userMapper;


public void testWrapper() {

    // 查询name不为空,且邮箱部位空的用户,年龄大雨等于12
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
    wrapper.isNotNull("name")
            .isNotNull("email")
            .ge("age", 12);
    userMapper.selectList(wrapper);

}

public void testWrapper2() {

    // 查询name 为 addicated age 大雨20
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();

    wrapper.eq("name","addicated").ge("age",12);
    // 查询一个数据时 使用selctone 查询多个使用selectList
    userMapper.selectOne(wrapper);

}


public void testWrapper3() {

    // 查询name 为 addicated age 大雨20
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
    // 查询age在一个范围的用户
    wrapper.between("age",20,30);
    // 查询一个数据时 使用selctone 查询多个使用selectList
    userMapper.selectList(wrapper);

}

public  void  testWrapper4(){
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();

    wrapper.notLike("name","e");
    // 左边和 右边 代表通配符在左边还是在右边。

// wrapper.likeRight() // wrapper.likeLeft()

}

public void testWrapper5(){
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
    // id 在自查询中查出来的 in sql 参数1,为需要过滤的属性字段,属性2 为目标要查询的子查询sql
    wrapper.inSql("id","select id from address");
}

public  void testWrapper6(){
    QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
    wrapper.orderByAsc("id");

}

}

```

乐观锁方面后续再补充更。