遞歸查詢樹形結構數據

1.初始化數據庫數據

DROP TABLE IF EXISTS `t_domain`;
CREATE TABLE `t_domain` (
  `id` varchar(36) NOT NULL,
  `domain_name` varchar(20) NOT NULL COMMENT '區劃名稱',
  `parent_domain_id` varchar(36) DEFAULT NULL COMMENT '父區劃id',
  `domain_type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '區劃類型 1銷售區劃 2運營區劃',
  `data_status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1:正常,2:凍結,3:刪除',
  `create_time` datetime DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='區劃表';

-- ----------------------------
-- Records of t_domain
-- ----------------------------
INSERT INTO `t_domain` VALUES ('0', '全國', null, '1', '1', null, '2019-03-15 11:28:16');
INSERT INTO `t_domain` VALUES ('2042bbee-9688-4741-bd9e-6579f186531a', '湘潭', 'dd7460f7-019e-45b9-ab16-44f2bc12a132', '2', '1', '2019-03-06 00:24:30', '2019-03-06 14:24:29');
INSERT INTO `t_domain` VALUES ('544897dc-bb5b-4f22-8483-19e89175f00e', '祁東1hao', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '1', '1', '2019-03-05 01:35:37', '2019-03-05 15:40:05');
INSERT INTO `t_domain` VALUES ('67bf668a-35cc-4051-90a0-5f4a78251d59', '長沙', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '1', '1', '2019-03-05 00:36:39', '2019-03-05 14:36:39');
INSERT INTO `t_domain` VALUES ('68639fd5-1deb-4975-bc9f-c516739b4ebd', '山東大區', '0', '1', '1', '2019-03-05 00:15:04', '2019-03-05 14:15:04');
INSERT INTO `t_domain` VALUES ('6ab58032-2df5-4edc-a4e5-8f8b6d45ead8', '祁東2hao', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '1', '1', '2019-03-05 00:42:23', '2019-03-05 15:40:09');
INSERT INTO `t_domain` VALUES ('a69dbe97-f5ea-4e7c-af34-fd182d413215', '祁東type2', 'd5d63419-3e81-406c-8993-0a4f5f943fc8', '2', '1', '2019-03-05 02:54:15', '2019-03-05 16:54:15');
INSERT INTO `t_domain` VALUES ('a8d20afd-6759-49d4-ac0b-c71214b7546b', '湖南大區', '0', '1', '1', '2019-03-05 00:35:18', '2019-03-05 14:35:18');
INSERT INTO `t_domain` VALUES ('c64f09e5-9bb8-4099-b27c-14c8176cfd82', '湘潭', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '2', '1', '2019-03-05 02:55:38', '2019-03-05 16:55:38');
INSERT INTO `t_domain` VALUES ('d5d63419-3e81-406c-8993-0a4f5f943fc8', '衡陽', 'a8d20afd-6759-49d4-ac0b-c71214b7546b', '1', '1', '2019-03-05 00:37:08', '2019-03-05 14:37:08');
INSERT INTO `t_domain` VALUES ('dd7460f7-019e-45b9-ab16-44f2bc12a132', '湖南大區', '0', '2', '1', '2019-03-06 00:23:06', '2019-03-06 14:23:05');

代碼新增數據:

//  分與權限的區劃添加,包括銷售區劃和運營區劃
@Test
public void test01(){

    Example example = new Example(TDomain.class);
    int totalCount = domainMapper.selectCountByExample(example);
    if(totalCount == 0){    //  如果表裏沒數據,加個全國進去
        TDomain bean = new TDomain();
        bean.setId("0");
        bean.setDomainName("全國");
        bean.setCreateTime(new Date());

        domainMapper.insertSelective(bean);
    }else{
        //   如果是從全國添加大區,傳0,否則就是取當前操作節點的id,如在大區上添加市,傳大區的id,
        String parentId = "a8d20afd-6759-49d4-ac0b-c71214b7546b";
        //   區劃類型 1銷售區劃 2運營區劃
        int domain_type = 1;

        TDomain bean = new TDomain();
        bean.setId(UUID.randomUUID().toString());
        bean.setDomainName("株洲");
        bean.setParentDomainId(parentId);
        bean.setDomainType(domain_type);
        bean.setCreateTime(new Date());

        int i = domainMapper.insertSelective(bean);
    }

}

2.實體類,省略set,get

@Table(name = "t_domain")
public class TDomain {

    @Id
    private String id;

    private String domainName;

    private String parentDomainId;

    private Integer domainType;

    @JSONField(serialize = false)
    private Integer dataStatus;

    @JSONField(serialize = false)
    private Date createTime;

    @JSONField(serialize = false)
    private Date updateTime;

    private List<TDomain> childList = new ArrayList<>();

3.mapper代碼

public interface DomainMapper extends Mapper<TDomain> {
    
    @Select("SELECT * FROM t_domain WHERE id = #{id} and data_status = 1")
    List<TDomain> getNode(@Param("id") String id);

    @Select("SELECT * FROM t_domain WHERE parent_domain_id = #{parentDomainId} and domain_type = #{domainType} and data_status = 1")
    List<TDomain> getNodeList(@Param("parentDomainId") String parentDomainId, @Param("domainType") int domainType);

4.方法代碼及測試結果

@Test
public void test666(){
    TDomain quhua = recursiveTree("0",1);
    logger.info(IJsonUtils.toJson(quhua));
}
public TDomain recursiveTree(String id,int domainType) {    //  id爲數據的主鍵ID
    TDomain node;
    List<TDomain> datas = domainMapper.getNode(id);
    if (datas.isEmpty()){
        return null;
    }else{
        node = datas.get(0);
    }
    List<TDomain> childTreeNodes = domainMapper.getNodeList(id,domainType);
    for(TDomain child : childTreeNodes){
        TDomain n = recursiveTree(child.getId(),domainType);
        node.getChildList().add(n);
    }
    return node;
}

[
    {
        "childList": [],
        "domainName": "山東大區",
        "domainType": 1,
        "id": "68639fd5-1deb-4975-bc9f-c516739b4ebd",
        "parentDomainId": "0"
    },
    {
        "childList": [
            {
                "childList": [],
                "domainName": "長沙",
                "domainType": 1,
                "id": "67bf668a-35cc-4051-90a0-5f4a78251d59",
                "parentDomainId": "a8d20afd-6759-49d4-ac0b-c71214b7546b"
            },
            {
                "childList": [
                    {
                        "childList": [],
                        "domainName": "祁東1hao",
                        "domainType": 1,
                        "id": "544897dc-bb5b-4f22-8483-19e89175f00e",
                        "parentDomainId": "d5d63419-3e81-406c-8993-0a4f5f943fc8"
                    },
                    {
                        "childList": [],
                        "domainName": "祁東2hao",
                        "domainType": 1,
                        "id": "6ab58032-2df5-4edc-a4e5-8f8b6d45ead8",
                        "parentDomainId": "d5d63419-3e81-406c-8993-0a4f5f943fc8"
                    }
                ],
                "domainName": "衡陽",
                "domainType": 1,
                "id": "d5d63419-3e81-406c-8993-0a4f5f943fc8",
                "parentDomainId": "a8d20afd-6759-49d4-ac0b-c71214b7546b"
            }
        ],
        "domainName": "湖南大區",
        "domainType": 1,
        "id": "a8d20afd-6759-49d4-ac0b-c71214b7546b",
        "parentDomainId": "0"
    }
]

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用mybatis自帶遞歸查詢功能實現:

1.mapper.xml

<?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">

<!--suppress SqlDialectInspection -->
<mapper namespace="com.wd.dao.privilege.DomainMapper">


    <resultMap id="SaleResult" type="com.wd.domain.po.TDomain">
        <id column="id" property="id"/>
        <result column="domain_name" property="domainName" />
        <result column="parent_domain_id" property="parentDomainId" />
        <result column="domain_type" property="domainType" />
        <result column="data_status" property="dataStatus" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <collection column="id" property="childList"
                    ofType="com.wd.domain.po.TDomain"
                    select="listForSale"></collection>
    </resultMap>

    <resultMap id="OperationResult" type="com.wd.domain.po.TDomain">
        <id column="id" property="id"/>
        <result column="domain_name" property="domainName" />
        <result column="parent_domain_id" property="parentDomainId" />
        <result column="domain_type" property="domainType" />
        <result column="data_status" property="dataStatus" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <collection column="id" property="childList"
                    ofType="com.wd.domain.po.TDomain"
                    select="listForOperation"></collection>
    </resultMap>

    <!--注意,遞歸查詢只能跟一個條件-->
    <!-- 遞歸查詢所有,傳最外層節點的parent_id值,數據庫裏的值,不能是null,比如定義parent_id=0表示最外層-->

    <!--銷售區劃樹查詢-->
    <select id="listForSale" resultMap="SaleResult">
        select * from t_domain where parent_domain_id = #{parentDomainId} and domain_type = 1;
    </select>

    <!--運營區劃樹查詢-->
    <select id="listForOperation" resultMap="OperationResult">
        select * from t_domain where parent_domain_id = #{parentDomainId} and domain_type = 2;
    </select>

</mapper>

2.mapper代碼

/**
 * 遞歸查詢銷售區劃樹
 *
 * @param parentDomainId 傳大區的parentDomainId,0哦,不能是null
 * @return
 */
List<TDomain> listForSale(@Param("parentDomainId") String parentDomainId);


/**
 * 遞歸查詢運營區劃樹
 *
 * @param parentDomainId 傳大區的parentDomainId,0哦,不能是null
 * @return
 */
List<TDomain> listForOperation(@Param("parentDomainId") String parentDomainId);

3.測試代碼

//  銷售區劃樹查詢
@Test
public void test02(){
    String  parentDomainId = "0";
    List<TDomain> domains = domainMapper.listForSale(parentDomainId);

    String json = IJsonUtils.toJson(domains);
    logger.info(json);
}

//  運營區劃樹查詢
@Test
public void test03(){
    String  parentDomainId = "0";
    List<TDomain> domains = domainMapper.listForOperation(parentDomainId);
    
    String json = IJsonUtils.toJson(domains);
    logger.info(json);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章