• 1.MidBook项目经验之MybatisPlus


    1.mp对数据库crud(mybatis的增强,简化开发) mp依赖包括mybatis不要重复引入
    继承BaseMapper自动生成
    //写配置文件可以生成mybatis执行的日志

    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
     userMapper.selectList(null);
     userMapper.insert(user); //mp自动生成主键, mp的主键生成策略常用 ASSINGN_ID自动生成19位的id,AUTO自动增长
    
    • 1
    • 2

    //不常用的ASSIGN_UUID生成uuid INPUT手动设置id,NONE不生成id
    //在实体类指定

       @TabledId(type=IdType.ASSIGN_ID) //默认值 ,使用雪花策略 64bit=1bit正负+41bit时间戳毫秒+10bit机器id(5bit是数据中心+5bit是集群id 可部署在1024个节点上)+12bit毫秒内的流水号
                //生成自增长的,并且不会hash碰撞
         private Long id;
    
    • 1
    • 2
    • 3
      //修改
    
    • 1
      userMapper.updateById(user);//必须要有id,都是返回影响行数
    
    • 1
      //自动填充开始和更新时间,在数据库创建字段create_time和update_time和在实体类增加字段
    
    • 1
       //实体类写上
                   @TableField(fill =Field.INSERT)
                    private Date createTime;
                     @TableField(fill =Field.INSERT_UPDATE)
                    private Date updateTime;
            //需要实现接口,设置填充的操作 MetaObjectHandler和insertFill和updateFill
     //下面 是完整代码
           @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("create_time",new Date(),metaObject);
            this.setFieldValByName("update_time",new Date(),metaObject);
    
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("update_time",new Date(),metaObject);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.mp实现乐观锁? 解决多线程丢失更新问题(两个线程同时开启事务,会导致更新数据丢失)(需要加一个version,更新一次+1,其他事务需要先比较版本号后更新)

    1.表加版本号version,实体类加属性
    @Version
    private Integer version;
    2.创建配置类 配置乐观锁插件即可生效

            @Configuration
    @MapperScan("com.example.mpproject.mapper")
    public class MpConfig {
        /**
         * 乐观锁插件
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    
            System.out.println("乐观锁插件");
            return new OptimisticLockerInterceptor();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    //测试

    @SpringBootTest
    class MpprojectApplicationTests {
        @Autowired
        private UserMapper userMapper;
        @Test
        void test01() {
            List<User> users = userMapper.selectList(null);
            System.out.println(users);
        }
        @Test
        void test02() {
            User user = new User();
            user.setAge(10);
            user.setName("aaa");
            int users = userMapper.insert(user);
            System.out.println(users);
        }
        @Test
        void test03() {
            //注意模拟乐观锁的效果需要先查询到再修改才能看到效果,创建对象单独更新没有效果(认为是一个线程)
            User user1 = userMapper.selectById(1671111003225481227L);
            user1.setName("bbb");
            int users = userMapper.updateById(user1);
            System.out.println(users);
        }
    
    }
    
    • 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

    3.多id批量查询和map条件查询

     userMapper.selectBatchIds(Arrays.asList(1,2,3));
        //了解即可
        map.put("name","jack");
            userMapper.selectByMap(map);
         //分页查询,常见,需要配置插件
               @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
          //分页代码
                  Page<User> page=new Page(1,3);
             Page<User> userPage= userMapper.selectPage(page,null);
                   .getRecords();//表的所有数据
               .getPages();//总页数
               .getCurrent();//当前页
         
             .getTotal();//表总记录数
               .hasNext();//有无下一页
               .hasPrevious();//有无上一页
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
        @Test
        void test04() {
    //        List users = userMapper.selectBatchIds(Arrays.asList(1,2, 3));
    //        System.out.println(users);
    //        HashMap map = new HashMap<>();
    //        map.put("NAME","Jone");
    //        List users1 = userMapper.selectByMap(map);
    //        System.out.println(users1);
    
            Page<User> page = new Page(1, 4);
            Page<User> userPage = userMapper.selectPage(page, null);
            log.info("-----分页--------");
            System.out.println(userPage.getRecords());
            System.out.println("current:"+userPage.getCurrent());
            System.out.println("size:"+userPage.getSize());
            System.out.println("pages:"+userPage.getPages());
            System.out.println("hasPrevious:"+userPage.hasPrevious());
            System.out.println("hasNext:"+userPage.hasNext());
            System.out.println("total:"+userPage.getTotal());
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4.删除(不用插件)
    //根据id删除

      int rows= userMapper.deleteById(1L);
    
    • 1
      //批量删除
    
    • 1
      userMapper.deleteBatchIds(Arrays.asList(1,2,3));     
    
    • 1

    //!!!逻辑删除(假的,加个字段0没有删除/1已删除)!!!重点(物理删除 真正删除表的数据)
    表加 deleted

         @TableLogic
         @TableField(fill =Fieldill.INSERT)
            private Integer deleted;
      //!!!查询时自动加 where deleted=0;
    
    • 1
    • 2
    • 3
    • 4

    5.条件查询

       QueryWrapper<User> wrapper= new QueryWrapper<>();
             wrapper.ge("age",21);//大于等于,   ge,gt,le,lt
              .eq("name","jams");
             .between("age",24,28);//包括24和28,notBetween
    
    • 1
    • 2
    • 3
    • 4

    //模糊查询

      .like("name","张");//自动两边的% ,有leftLike(%张) 和rightLike(张%)代表%的位置  [%代表一个或多个,不包括0哦!!!]
    
    • 1

    //降序和升序

    .orderByDesc("id");
    
    • 1
        @Test
        void test07() {
            QueryWrapper queryWrapper = new QueryWrapper();
    //        queryWrapper.eq("age",24);
    //
    //        User user = userMapper.selectOne(queryWrapper);
    //        System.out.println(user);
    //        queryWrapper.ge("age",10);
    //        queryWrapper.between("age",10,21);
    //        queryWrapper.like("name","aaa");
    //        queryWrapper.likeRight("name","bb");
    //        queryWrapper.orderByAsc("id");
            queryWrapper.orderByDesc("id");
            List list = userMapper.selectList(queryWrapper);
            System.out.println(list);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    Tomcat调优【精简版】
    maven
    使用集成开发环境来开发Go项目
    手把手入门Egg.js
    敢不敢和佳信文本机器人PK,你和它哪个更高情商~
    【Django多对多使用through自定义中间表详解】
    【必知必会】手把手教你配置MySQL环境变量——图文详解
    SpringMVC:从入门到精通,7篇系列篇带你全面掌握--三.使用SpringMVC完成增删改查
    使用jenkins自动化部署
    Python抽象类
  • 原文地址:https://blog.csdn.net/weixin_47039303/article/details/133846325