Mybatis-plus中的DML编程控制–增删改的高级操作

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Mybatis-plus中的DML编程控制–增删改的高级操作,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Mybatis-plus中的DML编程控制–增删改的高级操作

1、Insert

1.1、id生成策略控制

  • 不同的表应用不同的id生成策略
    • 日志:自增(1,2,3,4,…)
    • 购物订单:特殊规则( FQ23948AK3843)
    • 外卖单:关联地区日期等信息(10 04 20200314 34 91)
    • 关系表:可省略id
    • ······
  • 名称:@TableId
  • 类型:属性注解
  • 位置:模型类中用于表示主键的属性定义上方
  • 作用:设置当前类中主键属性的生成策略
  • 代码段:
package com.mannor.mybatis_plus_demo.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

public class User {
    @TableId(type = IdType.AUTO) //指定Id为自增属性,不然产生一个很大的数字来作为主键
    private Long id;
}
  • 相关属性
    • value:设置数据库主键名称
    • type:设置主键属性的生成策略,值参照IdType枚举值
ID生成策略:
1. AUTO(0)︰使用数据库id自增策略控制id生成NONE(1):不设置id生成策略
2. INPUT(2):用户手工输入id
3. ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)
4. ASSIGN_UUID(4):以UUID生成算法作为id生成策略

防止为了大量的实体类使用这种会显得麻烦,所以可以在配置类上进行设定:mybatis-plus.global-config.db-config.id-type: auto
同时,亦可以设置表名前缀:tableprefix:tb_(简写)

2、Delete

2.1、多记录删除

    @Test
    void testDeleteList() {
        List<Long> list = new ArrayList<>();
        list.add(1L);
        list.add(6L);
        userDao.deleteBatchIds(list);
    }

多记录查询也是类似

2.2、逻辑删除

  • 删除操作业务问题:业务数据从数据库中丢弃,关联的数据也会被删除掉
  • 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
  1. 在数据库中添加一个字段,设置默认值为0,1表示删除;
  2. 在对应的实体类中添加字段,并且添加@TableLogic注解
package com.mannor.mybatis_plus_demo.pojo;

import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

	private Long Id;
    //逻辑删除字段,标记当前记录是否被删除
    @TableLogic(value = "0",delval = "1")
    private Integer deleted;

}

增加此操作之后,执行delete操作,底层就会替换成update操作,将deleted字段值改为1,实现了逻辑删除。
在对该表执行查询操作的时候,也不会查询到delete为1的记录,相当于添加了where deleted=1
同理:也可以在yml文件中进行全局配置,键入logic等待提示(自行操作)。

3、Update过程中的并发现象

3.1、乐观锁

  • 业务并发现象带来的问题:秒杀(并发访问)

在MP中使用乐观锁的实现,本质上是在SQL语句上添加了version=version+1,此种方法可以解决2000以下的并发。
具体实现:

  1. 在数据库表中添加version字段,设置默认值为1;
  2. 在对应的实体类中添加version字段,并且在上面填加@Version注解;
  3. 实现一个生成拦截器的构造类;
package com.mannor.mybatis_plus_demo.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MPConfig {


    @Bean
    public MybatisPlusInterceptor mpInterceptor() {

        // 1.定义拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        // 2.定义具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());// 分页的拦截器
        // 3.添加乐观锁拦截器
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;
    }
}

此时,控制并发的操作已经完成,所有查询的用户会拿到version的值,操作时会比对拿到的version与数据库中的version比对,操作之后Version=version+1,所以有且只有一个用户会修改到数据库(当version特定的时候,如秒杀到最后一个)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/150347.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!