简介
行政区划的表为一个多层级结构,设计大同小异,大致结构如下所示
其中,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>
查询结果
(二)层级列表,使用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>
查询结果