1.MidBook项目经验之MybatisPlus

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

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

//不常用的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;
  //修改
  userMapper.updateById(user);//必须要有id,都是返回影响行数
  //自动填充开始和更新时间,在数据库创建字段create_time和update_time和在实体类增加字段
   //实体类写上
               @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);
    }
}

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();
    }
}

//测试

@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);
    }

}

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();//有无上一页
    @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());

    }

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

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

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

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

5.条件查询

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

//模糊查询

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

//降序和升序

.orderByDesc("id");
    @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);
    }

你可能感兴趣的:(MidBook项目经验,MybatisPlus)