java后端使用树结构表示省,市,县的实例

1、此处只有后端的部分,测试使用的是swagger

Result类:

package com.chaoxing.user.beans.DTO;


import com.google.gson.Gson;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;

@ApiModel("响应对象")
public class Result<T> implements Serializable {
    private static final long serialVersionUID = -8614669828681890797L;
    public static final int SUCCESS = 1;
    public static final int FAIL = 0;
    @ApiModelProperty(
            value = "结果码",
            dataType = "Integer",
            required = true
    )
    private int status;
    @ApiModelProperty(
            value = "结果描述",
            dataType = "String",
            required = true
    )
    private String message;
    @ApiModelProperty("响应数据对象")
    private T data;

    public Result() {
    }

    public Result(int status, String message) {
        this.status = status;
        this.message = message;
        this.data = null;
    }

    public Result(T data) {
        this.status = 1;
        this.message = "SUCCESS";
        this.data = data;
    }

    public Result(int status, T data, String message) {
        this.status = status;
        this.data = data;
        this.message = message;
    }

    @Override
    public String toString() {
        Gson gson = new Gson();
        return gson.toJson(this);
    }

    public static <T> Result<T> custom(int status, T t, String message) {
        return new Result(status, t, message);
    }

    public static <T> Result<T> custom(int status, String message) {
        return new Result(status, message);
    }

    public static <T> Result<T> success(T t, String message) {
        return new Result(1, t, message);
    }

    public static <T> Result<T> success(String message) {
        return new Result(1, message);
    }

    public static <T> Result<T> fail(T t, String message) {
        return new Result(0, t, message);
    }

    public static <T> Result<T> fail(String message) {
        return new Result(0, message);
    }

    public static Result<String> success() {
        return new Result(1, "OK");
    }

    public static Result<String> fail() {
        return new Result(0, "FAIL");
    }

    public int getStatus() {
        return this.status;
    }

    public String getMessage() {
        return this.message;
    }

    public T getData() {
        return this.data;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setData(T data) {
        this.data = data;
    }
}

AreaTreeDTO 类:

import lombok.Data;

import java.util.List;

@Data
public class AreaTreeDTO {

//    当前地区
    private AreaInfoDTO areaInfoDTO ;

//    当前地区的下一级地区
    private List<AreaTreeDTO> areaTreeDTOS  ;

}

 

AreaInfo类:

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Table(name = "area_info")
public class AreaInfo {
    /**
     * id
     */
    @Id
    private Long id;

    /**
     * 区域名称
     */
    @Column(name = "area_name")
    private String areaName;

    /**
     * 区域编码
     */
    @Column(name = "area_code")
    private String areaCode;

    /**
     * 父类id
     */
    @Column(name = "parent_id")
    private Long parentId;

    /**
     * 创建时间
     */
    @Column(name = "create_time")
    private Date createTime;

    /**
     * 备注
     */
    private String remark;

    /**
     * 1:正常   0:删除
     */
    private Integer status;

    /**
     * 获取id
     *
     * @return id - id
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置id
     *
     * @param id id
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取区域名称
     *
     * @return area_name - 区域名称
     */
    public String getAreaName() {
        return areaName;
    }

    /**
     * 设置区域名称
     *
     * @param areaName 区域名称
     */
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    /**
     * 获取区域编码
     *
     * @return area_code - 区域编码
     */
    public String getAreaCode() {
        return areaCode;
    }

    /**
     * 设置区域编码
     *
     * @param areaCode 区域编码
     */
    public void setAreaCode(String areaCode) {
        this.areaCode = areaCode;
    }

    /**
     * 获取父类id
     *
     * @return parent_id - 父类id
     */
    public Long getParentId() {
        return parentId;
    }

    /**
     * 设置父类id
     *
     * @param parentId 父类id
     */
    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    /**
     * 获取创建时间
     *
     * @return create_time - 创建时间
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * 设置创建时间
     *
     * @param createTime 创建时间
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 获取备注
     *
     * @return remark - 备注
     */
    public String getRemark() {
        return remark;
    }

    /**
     * 设置备注
     *
     * @param remark 备注
     */
    public void setRemark(String remark) {
        this.remark = remark;
    }

    /**
     * 获取1:删除 0:正常
     *
     * @return status - 1:删除 0:正常
     */
    public Integer getStatus() {
        return status;
    }

    /**
     * 设置1:删除 0:正常
     *
     * @param status 1:删除 0:正常
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

controller类:

@Controller
@Api(tags = "地区模块")
public class AreaController {

    @Autowired
    private IAreaService areaService ;

    @GetMapping("/selectAreaListById")
    @ApiOperation("级联查询地区")
    @ResponseBody
    public Result selectAreaListById(String id) {
        return areaService.selectAreaListById(id);
    }


    @GetMapping("/selectAreaDataById")
    @ApiOperation("级联查询地区树数据结构")
    @ResponseBody
//   参数 id  对应的 是 parentId
    public Result selectAreaDataById( String id) {
        return areaService.selectAreaDataById(id);
    }

}

注释:第二个接口,查出来的内容是树形的。

Service类:IAreaService 

public interface IAreaService {
    Result selectAreaListById(String id);

    Result selectAreaDataById(String id);
}

ServiceImpl类:

@Service
public class AreaServiceImpl implements IAreaService {

    @Autowired
    private IAreaDao areaDao ;

    @Override
    public Result selectAreaListById(String id) {

        if (null == id || "".equals(id.trim())){
            id = "0" ;
        }

        List<AreaInfo> areaInfos =  areaDao.selectAreaListById(id) ;

        if (null != areaInfos && areaInfos.size()>0){
            List<AreaInfoDTO> areaInfoDTOList=  AreaInfoConvert.INSTANCE.doList2DtoList(areaInfos) ;
            return  Result.success(areaInfoDTOList,"查询成功") ;
        }

        return Result.fail("数据为空,查询失败");
    }

    @Override
    public Result selectAreaDataById(String id) {

        if (null == id || "".equals(id.trim())){
            id = "0" ;

        }//判断id中是否有值,如果有值就不走,如果没有值,就会将id变成0
        AreaInfo areaInfo ;   //实体类AreaInfo,这个是DO,是一个数据库的对象实体
        //将查出来的信息,封装在实体类中。只是一个实体,不是很多实体类
        if ("0".equals(id)){
            areaInfo =   areaDao.selectAreaInfoById("1") ;
        }else {
            areaInfo =   areaDao.selectAreaInfoById(id) ;
        }
        //如果查出来的数据为空的时候,就会查询失败
        if (null==areaInfo){
            return Result.fail("数据为空,查询失败");
        }
        //创建一个DTD的对象
        AreaTreeDTO  areaTreeDTO = new AreaTreeDTO() ;
        //将地区信息里面的参数,改成地区信息DTO的形式
        areaTreeDTO.setAreaInfoDTO(AreaInfoConvert.INSTANCE.do2Dto(areaInfo));
        //查询一个列表,就是parent_id=id的就是我们要查询的,最后,返回的是一个list的列表
        List<AreaInfo> areaInfos =  areaDao.selectAreaListById(id) ;
        //然后查询的列表进行判断,如果有子节点,就将子节点放在父节点下面。
        if (null != areaInfos && areaInfos.size()>0){
            List<AreaTreeDTO> areaDataDTOS = getAraaList(areaInfos) ;
            areaTreeDTO.setAreaTreeDTOS(areaDataDTOS);

            return  Result.success(areaDataDTOS,"查询成功") ;
        }

        return Result.fail("数据为空,查询失败");


    }


    /**
     * 无限极递归
     *
     *
     * @param list
     * @return
     */
    private  List<AreaTreeDTO> getAraaList(List<AreaInfo> list) {
        List<AreaTreeDTO> areaDataDTOS = new ArrayList<>() ;
//1,第一层
        list.stream().forEach(areaInfo -> {
            Long parentId = areaInfo.getId();
//2,第二层
            List<AreaInfo> areaInfos = areaDao.selectAreaListById(parentId.toString());

            AreaTreeDTO areaTreeDTO = new AreaTreeDTO() ;
            areaTreeDTO.setAreaInfoDTO(AreaInfoConvert.INSTANCE.do2Dto(areaInfo));

            if (null!=areaInfos && areaInfos.size()>0){
                //            递归核心地方
                List<AreaTreeDTO> areaTreeDTOList =   getAraaList(areaInfos) ;
                areaTreeDTO.setAreaTreeDTOS(areaTreeDTOList);
            }
            areaDataDTOS.add(areaTreeDTO) ;

        });

        return areaDataDTOS ;
    }

}

mapper类:

import java.util.List;

public interface IAreaDao {
    List<AreaInfo> selectAreaListById(String id);

    AreaInfo selectAreaInfoById(String id);
}

mapperImpl类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Repository
public class AreaDaoImpl implements IAreaDao {

    @Autowired
    private AreaInfoMapper areaInfoMapper ;

    @Override
    public List<AreaInfo> selectAreaListById(String parentId) {
        Example example = new Example(AreaInfo.class);
        example.createCriteria()
                .andEqualTo("parentId",parentId)
                .andEqualTo("status", Constant.STATUS_ENABLE);
        return areaInfoMapper.selectByExample(example);
    }

    @Override
    public AreaInfo selectAreaInfoById(String id) {
        Example example = new Example(AreaInfo.class);
        example.createCriteria()
                .andEqualTo("id",id)   //会根据id,进行查找
                .andEqualTo("status", Constant.STATUS_ENABLE);   //查找的时候,会进行判断,如果是1,就是没有被删除,如果是0就是已经删除了。
        return areaInfoMapper.selectOneByExample(example);
    }
}

注释:有些包可能没有导入,因此可以改成自己的。

上面使用的方法,来自

tk_mybatis的mybatis_generator插件实现的类自带的接口。

使用Example类,需要传入一个值,这个值是实体类的编译后的类,通过反射的方式进行。

整个使用的方法是固定的,需要查询的就是,id,和status两个字段的属性。

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值