3.MyBatis Plus CRUD深入学习

3.MyBatis Plus CRUD深入学习

3.1 Insert 插入操作

​ 第一步:编写测试代码

@Test
void testInsert() {
    User user = new User();
    user.setName("xuan");
    user.setAge(20);
    user.setEmail("1870136088@qq.com");
    int i = userMapper.insert(user);
    System.out.println(i);  //影响行数
}

​ 第二步:查看运行结果

  • 由于我们并没有编写id 我们可以通过日志看看生成id的情况
  • 发现它生成id并不是自增情况 可能是采用某种生成主键id的策略 接下来就分析研究下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Tu0vElz-1595380158292)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20200721115034474.png)]

​ 第三步:研究下id生成策略(自增、uuid、雪花算法(分布式)、redis、zookeeper)

博客地址https://www.cnblogs.com/haoxinyue/p/5208136.html

里面基本讲述了上述id生成策略

3.1.1 id生成器之雪花算法

当然由于我们上面的id生成策略是雪花算法,所以我们接下来就主要分析雪花算法

​ 什么是雪花算法?

  • snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

  • snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。

    优点:

    1)不依赖于数据库,灵活方便,且性能优于数据库。

    2)ID按照时间在单机上是递增的。

    缺点:

    1)在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。

3.1.2 主键策略

​ 第四步:研究不同的主键策略

  • 首先实体类代码以及@TableId注解
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type= IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  • IdType是一个枚举类型
描述
AUTO数据库ID自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert前自行set主键值
ASSIGN_ID分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)
ID_WORKER分布式全局唯一ID 长整型类型(please use ASSIGN_ID)
UUID32位UUID字符串(please use ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一ID 字符串类型(please use ASSIGN_ID)

源码如下

package com.baomidou.mybatisplus.annotation;

public enum IdType {
    AUTO(0), 	//数据库id自增
    NONE(1),	//未设置主键
    INPUT(2),	//手动输入
    ASSIGN_ID(3),	//分配ID (主键类型为number或string)
    ASSIGN_UUID(4),	//分配UUID (主键类型为 string)
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),	//默认的全局id
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),	//字符串表示
    /** @deprecated */
    @Deprecated
    UUID(4);	//全局唯一id

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}
  • @TableId(type= IdType.ID_WORKER) ID_WORKER作为默认的主键策略

  • AUTO枚举类型测试:

    • 首先需要将sqlyog的自增勾上
    • 其次@TableId(type= IdType.AUTO)类型设置问auto
    • 运行之前的测试代码 测试结果如下(明显就是自增 每次自增1)

在这里插入图片描述

3.2 Update更新操作

​ 第一步:代码实现来测试一下

  • 这里需要注意的是updateById这个方法传参数是User对象
@Test
void testUpdate() {
    User user = new User();
    user.setId(5L);
    user.setName("yingge");
    user.setAge(20);
    user.setEmail("111111@qq.com");

    int i = userMapper.updateById(user);
    System.out.println(i);  //影响行数
}
  • 测试结果(发现更新成功)

在这里插入图片描述

​ 其实主要是想体现mybatis-plus动态拼接sql操作(mybatis本身就有)

3.3 Select查询操作

​ 查询一个、多个用户、map条件查询测试 分页查询直接就整合到分页插件里面去了

@Test
void testSelect() {
    //查询一个用户
    User user = userMapper.selectById(2L);
    System.out.println(user);

    //查询多个用户
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    for (User user1 : users) {
        System.out.println(user1);
    }

    //map条件查询
    Map<String,Object> map=new HashMap<>();
    map.put("name","xuan");
    List<User> userList = userMapper.selectByMap(map);
    userList.forEach(System.out::println);
}

3.4 Delete删除操作

​ 下面主要讲一下Mybatisplus中删除方法,具体的测试其实是与插入相对的很简单 逻辑删除下面单独学习

  • **
        * 根据 ID 删除
        *
        * @param id 主键ID
        */
       int deleteById(Serializable id);
     
       /**
        * 根据 columnMap 条件,删除记录
        *
        * @param columnMap 表字段 map 对象
        */
       int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
     
       /**
        * 根据 entity 条件,删除记录
        *
        * @param wrapper 实体对象封装操作类(可以为 null)
        */
       int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
     
       /**
        * 删除(根据ID 批量删除)
        *
        * @param idList 主键ID列表(不能为 null 以及 empty)
        */
       int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值