mybatisplus02
1、乐观锁
问题
解决
1.entity
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
//乐观锁 解决丢失更新的数据 加一个版本号 自动填充 1
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
//表中字段遵守驼峰 column create_time
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
2.mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
3.handler包下MyMetaObjectHandler.java
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 交给spring管理
* 用于 mybatisplus实体类中 @TableField(fill = FieldFill.INSERT)
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用mp实现添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
// 根据名称设置属性值
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
//乐观锁 自动填充
this.setFieldValByName("version", 1, metaObject);
}
//使用mp实现修改操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
4.config包下MpConfig配置类 配置乐观锁插件
/**
* 配置类
*/
@Configuration
//@MapperScan("com.atguigu.mpdemo1010.mapper")
public class MpConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
5.单元测试
@org.junit.Test
public void testleguansuo(){
User user = userMapper.selectById(1293537854245543937L);
user.setAge(999);
int i = userMapper.updateById(user);
System.out.println(i);
}
2、分页
在配置类里面加入分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
分页测试
//分页查询
@org.junit.Test
public void testPage() {
//1 创建page对象
//传入两个参数:当前页 和 每页显示记录数
Page<User> page = new Page<>(1,3);
//调用mp分页查询的方法
//调用mp分页查询过程中,底层封装
//把分页所有数据封装到page对象里面
userMapper.selectPage(page,null);
//通过page对象获取分页数据
System.out.println(page.getCurrent());//当前页
System.out.println(page.getRecords());//每页数据list集合
System.out.println(page.getSize());//每页显示记录数
System.out.println(page.getTotal()); //总记录数
System.out.println(page.getPages()); //总页数
System.out.println(page.hasNext()); //下一页
System.out.println(page.hasPrevious()); //上一页
}
3、逻辑删除
在mpconfig配置类中加入逻辑删除插件
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
实体类中加入deleted
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
在insertFill方法中加入
默认0为未删除,1为删除
this.setFieldValByName("deleted", 0, metaObject);
测试
/**
* 逻辑删除启用之后
*
* ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
* ==> Parameters: 1(Long)
* <== Updates: 1
*
* SELECT id,name,age,email,version,deleted,create_time,update_time FROM user WHERE deleted=0
*/
@org.junit.Test
public void testDelete(){
int i = userMapper.deleteById(1L);
System.out.println(i);
}
4、性能分析插件
mpconfig配置类中加入
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
* 三种环境
* * dev:开发环境
* * test:测试环境
* * prod:生产环境
*/
@Bean
@Profile({"dev","test"}) // 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(500); //ms,超过此处设置的ms报错 但是sql任然执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
application.properties中开启
#环境设置:dev、test、prod
spring.profiles.active=dev