配置mybatisplus输出调试日志
# 方式一
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 方式二 application.yml 中增加配置,指定 mapper 文件所在的包
logging:
level:
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);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
<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);
}
删除
- 直接通过继承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");
}
}
```
乐观锁方面后续再补充更。