使用mybatis-collection级联功能进行递归查询

it2024-03-24  69

表结构(三个表)

汽车品牌表

 

汽车型号表  父级是汽车品牌表主键

汽车款式表 父级是汽车型号表主键id

 

业务层就不写了主要是xml层

实体类接受格式 一级套一级  

 

public class ZqCarBrand implements Serializable {

    private static final long serialVersionUID = 1L;

    /**      * 汽车品牌id      */     private Long id;

    /**      * 汽车品牌名称      */     private String name;

    /**      * 汽车品牌字母      */     private String brandLetter;

    /**      * 车型list      */     private List<ZqCarModel> children;

}

 

 

 

public class ZqCarModel implements Serializable {

    private static final long serialVersionUID = 1L;

    /**      * 车型主键id      */     private Long id;

    /**      * 汽车品牌id      */     private Long parentId;

    /**      * model_name      */     private String name;

    /**      * 汽车年份list      */     private List<ZqCarYear> children;

}

 

 

public class ZqCarYear implements Serializable {

    private static final long serialVersionUID = 1L;

    /**      * 汽车年份id      */     private Long id;

    /**      * 汽车型号id      */     private Long parentId;

    /**      * 车款名称      */     private String name;

}

 

下面的是最主要的:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.zq.mapper.ZqCarBrandMapper">    <!-- 汽车年份实体 -->     <resultMap id="CarYearResultMap" type="com.ruoyi.zq.domain.base.ZqCarYear" >                 <result column="year_id" property="id" />                 <result column="model_id" property="parentId" />                 <result column="name" property="name" />     </resultMap>           <!-- 汽车型号 -->     <resultMap id="CarModelResultMap" type="com.ruoyi.zq.domain.base.ZqCarModel" >                 <result column="model_id" property="id" />                 <result column="brand_id" property="parentId" />                 <result column="model_name" property="name" />                 <collection property="children" ofType="CarYearResultMap" javaType="java.util.List" column="model_id" select="queryCarYearListByModelId">                                  </collection>     </resultMap>          <!-- 汽车品牌 -->     <resultMap id="CarBrandtResultMap" type="com.ruoyi.zq.domain.base.ZqCarBrand" >                 <result column="brand_id" property="id" />                 <result column="brand_name" property="name" />                 <result column="brand_letter" property="brandLetter" />                                  <collection property="children" ofType="CarModelResultMap" javaType="java.util.List"  column="brand_id" select="queryCarModelByBrandId">                                 </collection>                      </resultMap>                 <!-- 查询汽车品牌实体 -->     <select id="selectCarList"  resultMap="CarBrandtResultMap">         select * from zq_car_brand where is_del=0 order by brand_letter asc     </select>          <!--通过品牌id查询对应的车型 -->     <select id="queryCarModelByBrandId" parameterType="java.lang.Long" resultMap="CarModelResultMap">        select * from zq_car_model where is_del=0 and brand_id=#{brandId}     </select>           <!--通过车型id查询对应的年份 -->     <select id="queryCarYearListByModelId" parameterType="java.lang.Long" resultMap="CarYearResultMap">        select year_id,model_id,CONCAT_WS('款',car_year,name) as name from zq_car_year where is_del=0 and model_id=#{modelId} order by car_year desc     </select> </mapper>

 

查询出来的格式是:

{     "id": 2,     "name": "ARCFOX"     "brandLetter": "A",     "children": [{         "id": 3,         "name": "ARCFOX LITE",         "parentId": 2         "children": [{             "id": 7,             "name": "2019款R300 原力版",             "parentId": 3         }, {             "id": 8,             "name": "2019款R300 引力版",             "parentId": 3         }, {             "id": 9,             "name": "2019款R300 魔力版",             "parentId": 3         }, {             "id": 10,             "name": "2017款原力版",             "parentId": 3         }, {             "id": 11,             "name": "2017款引力版",             "parentId": 3         }],     }, {         "id": 4,         "name": "ARCFOX αT",         "parentId": 2         "children": [{             "id": 12,             "name": "2021款480S",             "parentId": 4         }, {             "id": 13,             "name": "2021款480S+",             "parentId": 4         }, {             "id": 14,             "name": "2021款653S",             "parentId": 4         }, {             "id": 15,             "name": "2021款653S+",             "parentId": 4         }, {             "id": 16,             "name": "2021款四驱性能版 H",             "parentId": 4         }],     }], }

 

2.如果需要查询的是三级联动是在同一个表中,同理 

实体如上一级套一级

 <!-- 区实体 -->     <resultMap id="areaResultMap" type="com.ruoyi.zq.domain.base.District" >                 <result column="area_id" property="id" />                 <result column="pid" property="parentId" />                 <result column="name" property="name" />     </resultMap>           <!-- 市实体 -->     <resultMap id="cityModelResultMap" type="com.ruoyi.zq.domain.base.City" >                 <result column="area_id" property="id" />                 <result column="pid" property="parentId" />                 <result column="name" property="name" />                 <collection property="children" ofType="areaResultMap" javaType="java.util.List" column="area_id" select="queryAreaListByPid">                                  </collection>     </resultMap>          <!-- 省实体 -->     <resultMap id="provinceResultMap" type="com.ruoyi.zq.domain.base.Province" >                 <result column="area_id" property="id" />                 <result column="name" property="name" />                                  <collection property="children" ofType="cityModelResultMap" javaType="java.util.List"  column="area_id" select="queryCityListByPid">                                 </collection>                      </resultMap>                 <!-- 查询省列表 -->     <select id="selectProvincesList"  resultMap="provinceResultMap">         select area_id,name from zq_area where level=1     </select>          <!--通过省id查询对应的市 -->     <select id="queryCityListByPid" parameterType="java.lang.Long" resultMap="cityModelResultMap">        select area_id,pid,name from zq_area where level=2 and pid=#{pid}     </select>          <!--通过市id查询对应的区域 -->     <select id="queryAreaListByPid" parameterType="java.lang.Long" resultMap="areaResultMap">         select area_id,name,pid from zq_area where level=3 and pid=#{pid}     </select>

 

这种查询起来的速度并不优秀 一般像三级联动或者省市区的三级联动 第一次可以使用嵌套查询  存入redis里面去   下次直接从redis里面去取数据  效率还是很优秀的

最新回复(0)