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); }