mybatis-plus02_增删改查、分页及常用插件

本文详细介绍了MyBatis-Plus的使用,包括插入、更新、查询和删除操作,以及主键生成策略、自动填充、乐观锁和分页功能。重点讲解了如何通过@TableId、@TableField等注解配置主键和填充字段,以及如何利用MetaObjectHandler实现自动填充创建时间和更新时间。还提到了乐观锁的实现方式,通过版本号防止丢失更新,并展示了分页查询的实现。最后,演示了批量删除和逻辑删除的功能。
摘要由CSDN通过智能技术生成

insert

	@Test
	public void addUser(){
		User user = new User();
		user.setName("lucy");
		user.setAge(30);
		user.setEmail("lucy@qq.com");

		int insert = userMapper.insert(user);
		System.out.println(insert);
	}

常见的主键的生成策略:

  • 自动增长:auto_increment,分库分表需要关注上一张表数据
  • UUID:每次随机生成一个唯一的值,排序不方便
  • Redis生成ID:不依赖数据库,灵活方便,性能优于数据库
  • mybatis-plus雪花策略:
    在主键上添加注解:@TableId(type = IdType.AUTO)
    AUTO(0), //自动增长
    NONE(1), //输入
    INPUT(2), //需要输入
    ID_WORKER(3), //雪花策略生成19位整数
    UUID(4), //随机唯一值
    ID_WORKER_STR(5); //雪花策略生成19位字符串

mybatis-plus配置主键生成策略:

update

	@Test
	public void updateUser(){
		User user = new User();
		user.setId(2L);
		user.setAge(120);
		int i = userMapper.updateById(user);
		System.out.println(i);
	}

自动填充:
不需要set属性,使用mybatis-plus实现数据添加
在需要填充的属性上加入注解:

package com.minghao.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

实现类MetaObjectHandler

package com.minghao.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    //添加时执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }

    //修改时执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

乐观锁

主要解决丢失更新问题。
不考虑事务隔离,读数据会产生3中问题:
脏读、不可重复读、幻读
写问题会产生丢失更新问题。
乐观锁通过版本号实现,

  • 添加private int version属性,并在其上面加入@Version
  • 在配置类中配置乐观锁bean
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
  • 在handler中配置乐观锁添加时的默认值
this.setFieldValByName("version", 1, metaObject);

select

多个ID同时查询

	@Test
	public void testSelectByIds(){
		List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
		for (User user : users) {
			System.out.println(user);
		}
	}

分页

在配置类中配置分页插件

    //分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }

创建Page对象,通过selectPage查询

	@Test
	public void testPage(){
		//创建page对象
		Page<User> page = new Page<>(1,3);
		//调用分页查询方法
		//page里就会存储查询对象
		userMapper.selectPage(page,null);
		//page.getCurrent()获取当前页
		System.out.println(page.getCurrent());
		//每页数据的list集合
		System.out.println(page.getRecords());
		//每页显示记录数
		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());
	}

delete

	@Test
	public void deleteById(){
		int i = userMapper.deleteById(1457285538125049857L);
		System.out.println(i);
	}

	@Test
	public void deleteByIds(){
		int i = userMapper.deleteBatchIds(Arrays.asList(2L, 3L));
		System.out.println(i);
	}

逻辑删除:

  • 数据库和实体类中添加属性,在属性上添加注解@TableLogic
  • 在handler中配置插入时默认值为0
this.setFieldValByName("deleted", 0, metaObject);
  • 配置逻辑删除插件
    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

性能分析插件

  • 在application.properties中配置当前项目环境
spring.profiles.active=dev
  • 在配置类中添加性能分析插件
    /**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     * 三种环境:dev开发、test测试、prod生产
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值