IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MybatisPlus-CRUD扩展 -> 正文阅读

[大数据]MybatisPlus-CRUD扩展

1.Insert

	@Test
    public void testInsert(){
        User user = new User();
        user.setName("黄凯宇");
        user.setAge(18);
        user.setEmail("1024955508@qq.com");

        int rs = userMapper.insert(user);
        System.out.println(user);
        System.out.println("结果=》"+rs); 
    }

请添加图片描述

我们实例化对象时并没有设置主键id,但是输出对象时id已经存在

数据库插入的id的默认值为:全局的唯—id

主键生成策略

public enum IdType {
    AUTO, //数据库id自增
    INPUT, //手动输入
    ID_WORKER, //默认的全局唯一id
    UUID, //全局唯一id  uuid
    NONE;//未设置主键
    **
}

AUTO: 我们需要配置主键自增

  • 在实体类字段上配置@TableId(type = IdType.AUTO)

请添加图片描述

  • 数据库字段设置自增

请添加图片描述

INPUT :手动输入id 需要自己写id

? 不设置id为空

img

2.update

 @Test
    public void testUpdate(){
        User user=new User();
        user.setId(1L);
        user.setName("alibaba");     //通过设置的属性动态拼接sql
        int rs = userMapper.updateById(user);  //byId 但是参数是个user,所以我们要在user里设置被修改属性的id
        System.out.println(user);
        System.out.println("结果=》"+rs);
    }

img

3.自动填充

创建时间、更改时间! 这些操作一般都是自动化完成,我们不希望手动更新

阿里巴巴开发手册︰几乎所有的表都要配置 gmt_create、gmt_modified !而且需要自动化

方式一:数据库级别(工作中一般不允许修改数据库)

1、在表中增加字段:create_time,update_time

请添加图片描述

2、我们需要在实体类中同步字段名!

private Date createTime;//驼峰命名
private Date updateTime;

3.测试并查看结果

img

方式二:代码级别

1、删除数据库的默认值CURRENT_TIMESTAMP

2、实体类字段属性上需要增加注解@TableField

//字段  字段添加填充内容
@TableField(fill = FieldFill.INSERT)//value = ("create_time"),
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

3、编写处理器来处理这个注解即可!

@Slf4j//日志
@Component//丢到springboot里   一定不要忘记把处理器加到Ioc容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override//插入时的填充策略
    public void insertFill(MetaObject metaObject) {
        log.info("==start insert ······==");
        //setFieldValByName(java.lang.String fieldName, java.lang.Object fieldVal, org.apache.ibatis.reflection.MetaObject metaObject)
        this.setFieldValByName("createTIme",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    @Override//更新时的填充策略
    public void updateFill(MetaObject metaObject) {
        log.info("==start update ······==");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

插入时,createTIme和updateTime一同更新

更新时,只有updateTime更新

4.乐观锁&悲观锁

乐观锁:顾名思义十分乐观,他总是认为不会出现问题,无论干什么都不上锁!如果出现了问题,再次更新值测试

悲观锁:顾名思义十分悲观,他总是认为出现问题,无论干什么都会上锁!再去操作!

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新时,set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

    #乐观锁:先查询,获得版本号
    -- A
    update user set name = "wsk",version = version+1 
    where id = 1 and version = 1
    -- B  (B线程抢先完成,此时version=2,会导致A线程修改失败!)
    update user set name = "wsk",version = version+1 
    where id = 1 and version = 1
    

测试一下Mybatis-Plus乐观锁插件

1、给数据库中增加version字段

img

2、实体类加对应的字段

@Version//乐观锁version注解
private Integer version;

3、注册组件

//扫描mapper文件夹
@MapperScan("com.huang.mapper")//交给mybatis做的,可以让这个配置类做扫描,将主类注解删除
@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MyBatisPlusConfig {
    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

4、测试

  • 成功
 //测试乐观锁成功
    public void  testOpimisticLocker(){

        //1、查询用户信息
        User user = userMapper.selectById(1L);
        //2、修改用户信息
        user.setAge(18);
        user.setEmail("1024955508@qq.com");
        //3、执行更新操作
        userMapper.updateById(user);
    }

img

  • 失败

    //测试乐观锁失败
        @Test//测试乐观锁失败  多线程下
        public void testOptimisticLocker2(){
            //线程1
            User user1 = userMapper.selectById(1L);
            user1.setName("乐观成功");
    
            //模拟另外一个线程执行了插队操作
            User user2 = userMapper.selectById(1L);
            user2.setName("插队");
    
            userMapper.updateById(user2);
            //自旋锁来多次尝试提交!
            userMapper.updateById(user1);//如果没有乐观锁就会覆盖插队线程的值
        }
    

请添加图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:33:20  更:2021-10-20 12:34:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:10:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码