100.【MybaisPlus】(二)

简介: 100.【MybaisPlus】
  1. 测试
// 测试插入
    @Test
    public void testInsert(){
        user user = new user();
        user.setName("吉士先生");
        user.setAge(21);
        user.setEmail("979748385@qq.com");
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

其他的主键策略解释

AUTO(0),  //数据库自增
    NONE(1),  //数据库未操作
    INPUT(2),  //手动输入
    ID_WORKER(3),  //雪花算法
    UUID(4),  //UUID
    ID_WORKER_STR(5); //雪花算法字符串解释法

实体类

package com.jsxs.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class user {
    // bigint->Long
    @TableId(type = IdType.INPUT)  //设置成自增
    private Long id;
    private String name;
    // int->Integer
    private Integer age;
    private String email;
}

测试类

// 测试插入
    @Test
    public void testInsert(){
        user user = new user();
        user.setName("吉士先生");
        user.setAge(21);
        user.setEmail("979748385@qq.com");
        user.setId(7L);
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

4.更新操作💲

🛑WARNING:

在工作的时候,我们假如使用MybatisPlus第三方插件。我们的修改操作、删除操作一定要注意。

update函数会修改全部

@Test
    public void testUpdate(){
        user user = new user();
        user.setId(7L);
        user.setName("李明先生");
        user.setAge(22);
        user.setEmail("979748385@qq.com");
        int update = userMapper.update(user, null);  //  增删改的返回值,其实就是被改变的行数
        System.out.println(update);
    }

delete函数会删除全部

根据id进行修改的操作

// 测试修改
    @Test
    public void testUpdate(){
        user user = new user();
        user.setId(7L);
        user.setName("李先生");
        user.setAge(22);
        user.setEmail("979748385@qq.com");
        int update = userMapper.updateById(user);  //  增删改的返回值,其实就是被改变的行数
        System.out.println(update);
    }

mybatis最牛逼的地方就是可以帮助我们动态的设置sql语句

5.自动填充

切记 date 和 datetime 和 timestmp的长度都为0

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

阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化!

方式一:数据库级别

1.在表中新增字段 gmt_create ,gmt_modified.默认未CREATE_TIMESTAMP

2.再次测试插入方法,我们需要先把实体类同步

private Date gmtCreate;
    private Date gmtUpdate;

再次更新查看结果即可

这里我们可是没有重新编写那个更新时间,是数据库帮我们做的

// 测试修改
    @Test
    public void testUpdate(){
        user user = new user();
        user.setId(7L);
        user.setName("李生");
        user.setAge(11);
        user.setEmail("979748385@qq.com");
        int update = userMapper.updateById(user);  //  增删改的返回值,其实就是被改变的行数
        System.out.println(update);
    }

方式二: 代码级别♻⚠

1.删除数据库默认值

2.实体类字段属性上添加注解

package com.jsxs.pojo;
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 {
    // bigint->Long
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    // int->Integer
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)  // 这个意思就是插入的操作,当我们插入的时候会帮助我们自动更新时间
    private Date gmtCreate;
    @TableField(fill = FieldFill.INSERT_UPDATE)  //这个意思就是更新的操作,当我们插入然后更新就会自动更新时间
    private Date gmtUpdate;
}

3.编写处理器来处理这个注解

创建一个handel包,然后我们要记得添加@Compoent

package com.jsxs.mapper.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
//  我们需要继承一个处理程序
@Component  // 注入到bean
@Slf4j   // 日志
public class MyMetaObjectHandler implements MetaObjectHandler {
    //  当我们插入的时候将会同时更新 创建时间和更新时间
    @Override
    public void insertFill(MetaObject metaObject) {
            log.info("开始插入......");
            // 插入值的名字、
            this.setFieldValByName("gmtCreate",new Date(),metaObject);
            this.setFieldValByName("gmtUpdate",new Date(),metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("更新......");
        this.setFieldValByName("gmtUpdate",new Date(),metaObject);
    }
}

5测试更新,观察时间即可!

6.乐观锁处理讲解

  1. 乐观锁: 顾名思义十分乐观,他总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新值测试
  2. 悲观锁;顾名思义十分悲观,他总是认为出现问题,无论干什么都会上锁!再去操作!
(1).乐观锁机制

我们这里主要讲解 乐观锁机制!

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时,set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

乐观锁官方: 当要更新一条记录的时候,希望这条记录没有被别人更新

假如说就是A线程在还没有确定的时候,B线程抢先于A线程完成

乐观锁: 1.先查询,获得版本号 version=1
-- A
我们的意思是当我们每次更新version的时候都会自增1,前提是version是等于1的
update user set name="jsxs",version=version+1
where id=2 and version=1
--B B线程抢先完成,这个时候version=2
我们的意思是当我们每次更新version的时候都会自增1,前提是version是等于1的
update user set name="jsxs",version=version+1
where id=2 and version=1
(2).乐观锁实现:
  1. 在数据库中新增version字段

  2. 我们数据库对应的实体类

实体类

package com.jsxs.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class user {
    // bigint->Long
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    // int->Integer
    private Integer age;
    private String email;
    @Version  // 乐观锁注解
    private Integer version;
    @TableField(fill = FieldFill.INSERT)  // 这个意思就是插入的操作,当我们插入的时候会帮助我们自动更新时间
    private Date gmtCreate;
    @TableField(fill = FieldFill.INSERT_UPDATE)  //这个意思就是更新的操作,当我们插入然后更新就会自动更新时间
    private Date gmtUpdate;
}

相关文章
|
安全 开发工具 数据安全/隐私保护
git的优势
【4月更文挑战第17天】Git的优势
250 2
|
存储 Java
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
[初始java]——规范你的命名规则,变量的使用和注意事项,隐式转化和强制转化
240 0
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
1309 0
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
|
运维 Java 数据库连接
两种方式实现Spring 业务验证
验证在任何时候都非常关键。考虑将数据验证作为业务逻辑开发有利也有弊,Spring 认为,验证不应该只在Web 端进行处理,在服务端也要进行相应的处理,可以防止脏数据存入数据库中,从而避免为运维同学和测试同学造成更大的困扰,因为数据造成的bug会更加难以发现,而且开发人员关注点也不会放在数据本身的问题上,所以做服务端的验证也是非常有必要的。考虑到上面这些问题,Spring 提供了两种主要类型的验证:
122 0
|
大数据
风口之上的无人货架为何尸横遍野?
风口之上的无人货架为何尸横遍野?
256 0
风口之上的无人货架为何尸横遍野?
|
Java Go 区块链
在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑(2)
在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑(2)
304 0
|
OceanBase 存储 数据库
OceanBase如何获得TPC-C测试第1名?
阿里妹导读:TPC-C是TPC组织(国际事务性能委员会)制定的关于商品销售的订单创建和订单支付等的基准测试标准,是数据库联机交易处理系统的权威基准测试标准。蚂蚁金服自研的分布式关系数据库OceanBase获得TPC-C测试第一名后,引起了大量关注,今天,我们邀请了OceanBase的核心研发人员对本次测试做专业的技术解读。
6348 0
|
SQL Java 数据库连接
mybatis笔记整理
前言: mybatis可以说是最容易上手的持久层框架了,相比于hibernate 而言,它都是直接用sql语句对数据库进行操作,而不是用hql,尤其是关联关系复杂的时候,mybatis更容易实现。
1226 0