• Mybatis-Plus的CURD实操



    在这里插入图片描述

    Mybatis-Plus的CURD实操

    1. 插入操作

        // 插入
        @Test
        public void insertUser(){
            User user = new User();
            user.setAge(18);
            user.setEmail("1440613133@qq.com");
            user.setName("张三");
            int i = userMapper.insert(user);
            System.out.println("影响行数: " + i);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20221111090137724

    image-20221111090405695

    • 可以看到,在数据库生成了一个唯一的随机数,这里介绍一下主键生成策略

    1.1雪花算法:

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

    主键自增

    1. 实体类字段上 @TableId(type = IdType.AUTO)

      image-20221111090843650

    2. 数据库字段一定要是自增!

    image-20221111090906093

    其他的源码解释

    public enum IdType {
      AUTO(0), // 数据库id自增
      NONE(1), // 未设置主键
      INPUT(2), // 手动输入
      ID_WORKER(3), // 默认的全局唯一id
      UUID(4), // 全局唯一id uuid
      ID_WORKER_STR(5); //ID_WORKER 字符串表示法
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 更新操作

        @Test
        void updateTest(){
            User user = new User();
            user.setName("小明");
            user.setAge(18);
            user.setId(1532944121482711054L);
            int i = userMapper.updateById(user);
            System.out.println("影响行数: " + i);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20221111091225700

    • 所有的sql都是自动动态配置的!

    2.1自动填充

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

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

    方式一

    1. 在表中新增字段 create_time, update_time

      • 设置create_time默认值为:CURRENT_TIMESTAMP
      • 不给update_time设置值,对比一下

      image-20221111100252047

    2. 再次测试插入方法。

    image-20221111100423501

    方式二

    1. 从代码入手
    2. 实体类字段属性上需要增加注解
    // 字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 编写处理器来处理这个注解即可!
    package com.weihong.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;
    
    @Slf4j
    @Component
    public class MyDateObjectHandler implements MetaObjectHandler {
        // 插入时自动填充策略
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("start insert fill");
            this.setFieldValByName("creatTime",new Date(), metaObject);
            this.setFieldValByName("updateTime",new Date(), metaObject);
        }
    
        // 修改时自动填充策略
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("update start fill");
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    1. 测试插入

    2. 测试更新、观察时间即可!

    image-20221111100810031

    3. 查询操作

     /**
         * 批量查找:
         * 按条件查找
         */
        @Test
        void findByMap(){
            Map<String , Object> map = new HashMap<>();
            map.put("name","张三");
            List<User> users = userMapper.selectByMap(map);
            for (User user : users) {
                System.out.println(user);
            }
        }
    
        /**
         * 测试批量查询
         */
        @Test
        void findBathMap(){
            // selectBatchIds(list a) Arrays.asList方法将数组装换成list集合
            List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3,4));
            users.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.1分页查询

    分页方法:

    1. 原始的 limit 进行分页
    2. pageHelper 第三方插件
    3. MP 其实也内置了分页插件!

    如何使用!

    1. 配置拦截器组件即可
    // 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
      return  new PaginationInterceptor();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、直接使用Page对象即可!

    // 测试分页查询
    @Test
    public void testPage(){
      // 参数一:当前页
      // 参数二:页面大小
      // 使用了分页插件之后,所有的分页操作也变得简单的!
      Page<User> page = new Page<>(2,5);
      userMapper.selectPage(page,null);
      page.getRecords().forEach(System.out::println);
      System.out.println(page.getTotal());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4. 删除操作

    4.1 根据 id 删除记录

    // 测试删除
    @Test
    public void testDeleteById(){
      userMapper.deleteById(1240620674645544965L);
    }
    // 通过id批量删除
    @Test
    public void testDeleteBatchId(){
     userMapper.deleteBatchIds(Arrays.asList(1240620674645544961L,124062067464554496
    2L));
    }
    // 通过map删除
    @Test
    public void testDeleteMap(){
      HashMap<String, Object> map = new HashMap<>();
      map.put("name","张三");
      userMapper.deleteByMap(map);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.2 逻辑删除

    物理删除 :从数据库中直接移除
    逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1

    • 管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!

    • 测试一下:

    1. 在数据表中增加一个 deleted 字段

    image-20221111102034918

    1. 实体类中增加属性

      @TableLogic //逻辑删除
      private Integer deleted;
      
      • 1
      • 2
    2. 配置!

      // 逻辑删除组件!
      @Bean
      public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      # 配置逻辑删除
      mybatis-plus.global-config.db-config.logic-delete-value=1
      mybatis-plus.global-config.db-config.logic-not-delete-value=0
      
      • 1
      • 2
      • 3
    3. 测试一下删除!

    image-20221111102239892

    • 记录依旧在数据库,但是值确已经变化了!

    • 以上的所有CRUD操作及其扩展操作,我们都必须精通掌握!会大大提高你的工作和写项目的效率!

    💖💖💖 完结撒花

    💖💖💖 如果命运是世上最烂的编剧。 那么你就要争取,做你人生最好的演员

    💖💖💖 写作不易,如果您觉得写的不错,欢迎给博主点赞、收藏、评论来一波~让博主更有动力吧

  • 相关阅读:
    你们眼睛干涩,胀痛吗?C# WPF 久坐提醒桌面小程序 - 内附 眼肌运动、远视力表高清图
    快乐生活的18条法则(建议收藏)
    kyverno VS gateKeeper
    阿里云99元的主机到底怎么样?
    英语写作中“建立”、“构造”build、construct、establish、set up的用法
    go自定义端口监听停用-------解决端口被占用的问题
    系统升级丨VR会议主动呼叫,开启云洽谈新模式
    最新发布!阿里云卓越架构框架重磅升级
    【C++】day6学习成果
    API接口获取商品订单详情返回值说明
  • 原文地址:https://blog.csdn.net/qq_41239465/article/details/127801546