行政区划表设计和多级查询


简介

行政区划的表为一个多层级结构,设计大同小异,大致结构如下所示

行政区划表设计和多级查询_第1张图片

其中,code为区划编号(主键),parent_code为父区划编号,ancestors为祖区划编号,查询也主要围绕前两个展开。

查询

(一)层级列表,懒查询

在展示时,一开始不用查询出所有内容,只用展示出所有省份、直辖市、自治区等,避免加载时间过长。

在返回实体类DTO中,增加了一个hasChildren的字段,告诉前端是否还有下一级。

mybatis查询
<select id="lazyTree" resultType="com.qhzz.csep.system.api.dto.RegionDTO">
        SELECT
        region.*,
        ( SELECT CASE WHEN count( 1 ) > 0 THEN 1 ELSE 0 END FROM bmp_region WHERE parent_code = region.code ) AS
        "has_children"
        FROM
        bmp_region region
        <where>
            1=1
            <if test="parentCode!=null">
                and region.parent_code = #{parentCode}
            </if>
        </where>
    </select>

查询结果
行政区划表设计和多级查询_第2张图片


(二)层级列表,使用mybatis级联查询

使用mybatis提供的查询方式,一次性查询出多层子集。

实体类DTO增加一个字段,即本身的集合字段

private List<RegionDTO> children;

mybatis的mapper.xml如下,selectByParentCode()方法将会查询出多层内容

<resultMap id="regionResultMap" type="com.qhzz.csep.system.api.entity.Region">
    <id column="code" property="code"/>
    <result column="parent_code" property="parentCode"/>
    <result column="ancestors" property="ancestors"/>
    <result column="name" property="name"/>
    <result column="province_code" property="provinceCode"/>
    <result column="province_name" property="provinceName"/>
    <result column="city_code" property="cityCode"/>
    <result column="city_name" property="cityName"/>
    <result column="district_code" property="districtCode"/>
    <result column="district_name" property="districtName"/>
    <result column="town_code" property="townCode"/>
    <result column="town_name" property="townName"/>
    <result column="village_code" property="villageCode"/>
    <result column="village_name" property="villageName"/>
    <result column="level" property="level"/>
    <result column="sort" property="sort"/>
    <result column="remark" property="remark"/>
resultMap>

<resultMap id="resultMapWithChildren" type="com.qhzz.csep.system.api.dto.RegionDTO" extends="regionResultMap">
    <collection property="children" ofType="com.qhzz.csep.system.api.dto.RegionDTO"
                select="selectByParentCode" column="code">collection>
resultMap>

<select id="selectByParentCode" resultMap="resultMapWithChildren">
    SELECT region.*
    FROM bmp_region region
    where region.parent_code = #{parentCode}
select>

查询结果
行政区划表设计和多级查询_第3张图片

你可能感兴趣的:(Java,java,mybatis,mysql)