利用springboot和mp结合stream()实现数据的多级分类

  • Post author:
  • Post category:其他


springboot是spring的一个开源子框架 以自动装配原理和各种简化 可以以最快最便捷的开发分布式微服务项目


MyBatis-Plus

(简称 MP)是一个

MyBatis

的增强工具,提供多种插件和条件构造器,为简化开发、提高效率而生。

stream()是Java新特性提供的一种流式编程 其中提供多种方法可以让你以一种声明的方式处理数据。

做之前先来看看递归思想

例如:5! = 5*4*3*2*1 = 120    公式: n!=n(n-1)!   函数:f(n) = n*f(n-1)     n>0

 public static int factorial(int num) {
        if (num == 0) {
            return 1;
        } else {
            return num * factorial(num - 1);
        }
    }

通俗来讲就是自己吊自己

以上是做这个业务基本要知道的

上代码!!!

实体层

package com.clemente.multilevelclassification.entity;

import java.math.BigDecimal;
import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;



@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_pub_area_info")//对应数据库表名 进行映射
public class TbPubAreaInfoEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId("ID")//对应数据库id字段
    private String id;


    @TableField("AREA_NAME")//对应数据库其他字段
    private String areaName;


    @TableField("PARENT_AREAID")
    private String parentAreaid;


    @TableField("AREA_LEVEL")
    private BigDecimal areaLevel;


    @TableField("LONGITUDE")
    private BigDecimal longitude;


    @TableField("LATITUDE")
    private BigDecimal latitude;


    @TableField("IS_USE")
    private BigDecimal isUse;


    @TableField("ORDER_NO")
    private BigDecimal orderNo;

    @TableField("RECORD")
    private String record;

    @TableField(fill = FieldFill.INSERT)
    @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")//基于Jackson的时间格式化
    private LocalDateTime recordDate;//可以利用mp做自动填充

    @TableField("MODIFIER")
    private String modifier;//可以利用mp做自动填充

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime modifyDate;

    @TableField(exist = false)//不存在数据库中
    @JsonInclude(JsonInclude.Include.NON_EMPTY)//当没有子类的时候去掉null 或者[]
    private List<TbPubAreaInfoEntity> Children;//子类元素的存储位置

}

mapper层

package com.clemente.multilevelclassification.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clemente.multilevelclassification.entity.TbPubAreaInfoEntity;
import org.apache.ibatis.annotations.Mapper;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: clement
 * @Date: 2022年08月07日  21:09
 * @Description:
 */
@Mapper
public interface TbPubAreaInfoMapper extends BaseMapper<TbPubAreaInfoEntity> {

}

service层

接口

package com.clemente.multilevelclassification.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.clemente.multilevelclassification.entity.TbPubAreaInfoEntity;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: clement
 * @Date: 2022年08月07日  21:09
 * @Description:
 */

public interface TbPubAreaInfoService extends IService<TbPubAreaInfoEntity> {

    List<TbPubAreaInfoEntity> ListWithTree();
}

实现类

package com.clemente.multilevelclassification.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.clemente.multilevelclassification.entity.TbPubAreaInfoEntity;
import com.clemente.multilevelclassification.mapper.TbPubAreaInfoMapper;
import com.clemente.multilevelclassification.service.TbPubAreaInfoService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: clement
 * @Date: 2022年08月07日  21:11
 * @Description:
 */
@Service("TbPubAreaInfoService")
public class TbPubAreaInfoServiceImpl extends ServiceImpl<TbPubAreaInfoMapper, TbPubAreaInfoEntity> implements TbPubAreaInfoService{
    @Override
    public List<TbPubAreaInfoEntity> ListWithTree() {
        //查询所有数据
        List<TbPubAreaInfoEntity> infoEntities = this.baseMapper.selectList(new QueryWrapper<TbPubAreaInfoEntity>(null));
        //查出一级分类
        List<TbPubAreaInfoEntity> entityList = infoEntities.stream().filter(item -> {//过滤并返回一级分类
            return item.getParentAreaid() == null;
            //映射 把item里面的每一个元素都应用于里面的映射规则并返回
        }).map(item->{                          //所有数据
            item.setChildren(getChildrens(item,infoEntities));
            return item;
            //收集  返回的数据以流的形式收集成了集合
        }).collect(Collectors.toList());
        return entityList;
    }
    //递归方法 方法自己吊自己
    private List<TbPubAreaInfoEntity> getChildrens(TbPubAreaInfoEntity root, List<TbPubAreaInfoEntity> all) {
        List<TbPubAreaInfoEntity> collect = all.stream().filter(item -> {
            //过滤并返回出含有子集的数据
            return root.getId().equals(item.getParentAreaid());
        }).map(item -> {
            item.setChildren(getChildrens(item, all));
            return item;
        }).collect(Collectors.toList());
        return collect;
    }
}

控制层

package com.clemente.multilevelclassification.controller;

import com.clemente.multilevelclassification.entity.TbPubAreaInfoEntity;
import com.clemente.multilevelclassification.service.TbPubAreaInfoService;
import com.clemente.multilevelclassification.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.annotation.Resources;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: clement
 * @Date: 2022年08月07日  21:05
 * @Description:
 */
@SuppressWarnings("all")//抑制警告线
@RequestMapping("tbpubareainfo")//请求映射父路径
@RestController//复合注解 @Controller + @ResponseBody

public class TbPubAreaInfoController {
    //@Qualifier根据名字注入 配合@Autowired在多个相同bean类型下使用
    //@Resource更具类型和名称注入 先根据bean类型在找bean名子
    @Autowired//根据bean类型注入
    TbPubAreaInfoService tbPubAreaInfoService;


   @GetMapping("/index")//请求子路径
    public R findAll(){
      List<TbPubAreaInfoEntity> data = tbPubAreaInfoService.ListWithTree();
        return R.ok().put("data",data);
   }

}

启动类

package com.clemente.multilevelclassification;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.clemente.multilevelclassification.mapper")//dao层
@SpringBootApplication
public class MultiLevelClassiFicationApplication {

    public static void main(String[] args) {
        SpringApplication.run(MultiLevelClassiFicationApplication.class, args);
    }

}

访问:

http://localhost:8080/tbpubareainfo/index

效果如图:

是不是感觉屌爆了 我也觉得!!!



版权声明:本文为HaoGeCSDN2002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。