Background
실제 개발 과정에서 긴급 상황을 대비해 노드 트리를 쿼리하고 지정된 노드를 기반으로 하위 노드 목록을 얻어야 하는 경우가 종종 있습니다.
사용 시나리오
는 시스템 부서 조직, 제품 분류, 도시 관계 등의 계층적 관계가 있는 데이터 구조에 사용할 수 있습니다.
디자인 아이디어
재귀 모델
i.e. 노드, 데이터 모델은 다음과 같습니다.
2
20000 | 휴대전화 |
0 |
|
3
10001
Lenovo 노트북 |
10000 |
|
4 |
10002
HP 노트북 |
100 00 |
| 5 |
1000101
Lenovo Savior |
10001 |
| 6 |
1000102
Lenovo Xiaoxin 시리즈 |
10001 |
|
| 구현 코드
테이블 구조 |
CREATE TABLE `tree_table` (
`id` int NOT NULL AUTO_INCREMENT COMMENT "主键ID",
`code` varchar(10) NOT NULL COMMENT "编码",
`name` varchar(20) NOT NULL COMMENT "名称",
`parent_code` varchar(10) NOT NULL COMMENT "父级编码",
PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT="树形结构测试表"; | 테이블 데이터 | INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10000", "电脑", "0");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10001", "联想笔记本", "10000");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("10002", "惠普笔记本", "10000");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("1000101", "联想拯救者", "10001");
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ("1000102", "联想小新系列", "10001");
Entity |
@Data
@TableName("tree_table")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TreeTable {
/**
* 主键ID
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 编码
*/
private String code;
/**
* 名称
*/
private String name;
/**
* 父级编码
*/
private String parentCode;
/**
* 子节点
*/
@TableField(exist = false)
private List<TreeTable> childNode;
}
mybatis |
mapper | public interface TreeTableMapper extends BaseMapper<TreeTable> {
/**
* 获取树形结构数据
*
* @return 树形结构
*/
public List<TreeTable> noteTree();
} | 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">
<mapper namespace="com.springboot.example.mysqltree.mapper.TreeTableMapper">
<resultMap id="BaseResultMap" type="com.springboot.example.mysqltree.model.entity.TreeTable">
<result column="id" property="id"/>
<result column="code" property="code"/>
<result column="name" property="name"/>
<result column="parent_code" property="parentCode"/>
</resultMap>
<resultMap id="NodeTreeResult" type="com.springboot.example.mysqltree.model.entity.TreeTable"
extends="BaseResultMap">
<collection property="childNode" column="code" ofType="com.springboot.example.mysqltree.model.entity.TreeTable"
javaType="java.util.ArrayList" select="nextNoteTree">
</collection>
</resultMap>
<sql id="Base_Column_List">
id,
code,
`name`,
parent_code
</sql>
<select id="nextNoteTree" resultMap="NodeTreeResult">
select
<include refid="Base_Column_List"/>
from tree_table
where parent_code=#[code]
</select>
<select id="noteTree" resultMap="NodeTreeResult">
select
<include refid="Base_Column_List"/>
from tree_table
where parent_code="0"
</select>
</mapper>
noteTree: 모든 상위 노드 데이터를 가져옵니다.
nextNoteTree: 리프 노드가 끝날 때까지 하위 노드 데이터를 가져옵니다.
column: 연결된 테이블의 열 이름;
ofType : 반환 유형
Startup class
@Slf4j
@Component
public class TreeTableCommandLineRunner implements CommandLineRunner {
@Resource
private TreeTableMapper treeTableMapper;
@Override
public void run(String... args) throws Exception {
log.info(JSONUtil.toJsonPrettyStr(treeTableMapper.noteTree()));
}
}
Final effect
[
{
"code": "10000",
"childNode": [
{
"code": "10001",
"childNode": [
{
"code": "1000101",
"childNode": [
],
"parentCode": "10001",
"name": "联想拯救者",
"id": 5
},
{
"code": "1000102",
"childNode": [
],
"parentCode": "10001",
"name": "联想小新系列",
"id": 6
}
],
"parentCode": "10000",
"name": "联想笔记本",
"id": 3
},
{
"code": "10002",
"childNode": [
],
"parentCode": "10000",
"name": "惠普笔记本",
"id": 4
}
],
"parentCode": "0",
"name": "电脑",
"id": 1
}
]
Notes
위 내용은 springboot+mybatis plus를 사용하여 트리 구조 쿼리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!