经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
springboot+mybatis plus实现树形结构查询
来源:jb51  时间:2021/7/21 20:21:12  对本文有异议

背景

实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需。

使用场景

可以用于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;

设计思路

递归模型

即根节点、枝干节点、叶子节点,数据模型如下:

id code name parent_code
1 10000 电脑 0
2 20000 手机 0
3 10001 联想笔记本 10000
4 10002 惠普笔记本 10000
5 1000101 联想拯救者 10001
6 1000102 联想小新系列 10001

实现代码

表结构

  1. CREATE TABLE `tree_table` (
  2. `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  3. `code` varchar(10) NOT NULL COMMENT '编码',
  4. `name` varchar(20) NOT NULL COMMENT '名称',
  5. `parent_code` varchar(10) NOT NULL COMMENT '父级编码',
  6. PRIMARY KEY (`id`) USING BTREE
  7. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='树形结构测试表';

表数据

  1. INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10000', '电脑', '0');
  2. INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10001', '联想笔记本', '10000');
  3. INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10002', '惠普笔记本', '10000');
  4. INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000101', '联想拯救者', '10001');
  5. INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000102', '联想小新系列', '10001');

实体

  1. @Data
  2. @TableName("tree_table")
  3. @EqualsAndHashCode(callSuper = false)
  4. @Accessors(chain = true)
  5. public class TreeTable {
  6. /**
  7. * 主键ID
  8. */
  9. @TableId(type = IdType.AUTO)
  10. private Integer id;
  11. /**
  12. * 编码
  13. */
  14. private String code;
  15. /**
  16. * 名称
  17. */
  18. private String name;
  19. /**
  20. * 父级编码
  21. */
  22. private String parentCode;
  23. /**
  24. * 子节点
  25. */
  26. @TableField(exist = false)
  27. private List<TreeTable> childNode;
  28. }

mybatis

mapper

  1. public interface TreeTableMapper extends BaseMapper<TreeTable> {
  2. /**
  3. * 获取树形结构数据
  4. *
  5. * @return 树形结构
  6. */
  7. public List<TreeTable> noteTree();
  8. }

xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.springboot.example.mysqltree.mapper.TreeTableMapper">
  4. <resultMap id="BaseResultMap" type="com.springboot.example.mysqltree.model.entity.TreeTable">
  5. <result column="id" property="id"/>
  6. <result column="code" property="code"/>
  7. <result column="name" property="name"/>
  8. <result column="parent_code" property="parentCode"/>
  9. </resultMap>
  10. <resultMap id="NodeTreeResult" type="com.springboot.example.mysqltree.model.entity.TreeTable"
  11. extends="BaseResultMap">
  12. <collection property="childNode" column="code" ofType="com.springboot.example.mysqltree.model.entity.TreeTable"
  13. javaType="java.util.ArrayList" select="nextNoteTree">
  14. </collection>
  15. </resultMap>
  16. <sql id="Base_Column_List">
  17. id,
  18. code,
  19. `name`,
  20. parent_code
  21. </sql>
  22. <select id="nextNoteTree" resultMap="NodeTreeResult">
  23. select
  24. <include refid="Base_Column_List"/>
  25. from tree_table
  26. where parent_code=#[code]
  27. </select>
  28. <select id="noteTree" resultMap="NodeTreeResult">
  29. select
  30. <include refid="Base_Column_List"/>
  31. from tree_table
  32. where parent_code='0'
  33. </select>
  34. </mapper>
  • noteTree :获取所有父级节点数据;
  • nextNoteTree:循环获取子节点数据,知道叶子节点结束;
  • column:关联表的列名;
  • ofType:返回类型

启动类

  1. @Slf4j
  2. @Component
  3. public class TreeTableCommandLineRunner implements CommandLineRunner {
  4. @Resource
  5. private TreeTableMapper treeTableMapper;
  6. @Override
  7. public void run(String... args) throws Exception {
  8. log.info(JSONUtil.toJsonPrettyStr(treeTableMapper.noteTree()));
  9. }
  10. }

最终效果

  1. [
  2. {
  3. "code": "10000",
  4. "childNode": [
  5. {
  6. "code": "10001",
  7. "childNode": [
  8. {
  9. "code": "1000101",
  10. "childNode": [
  11. ],
  12. "parentCode": "10001",
  13. "name": "联想拯救者",
  14. "id": 5
  15. },
  16. {
  17. "code": "1000102",
  18. "childNode": [
  19. ],
  20. "parentCode": "10001",
  21. "name": "联想小新系列",
  22. "id": 6
  23. }
  24. ],
  25. "parentCode": "10000",
  26. "name": "联想笔记本",
  27. "id": 3
  28. },
  29. {
  30. "code": "10002",
  31. "childNode": [
  32. ],
  33. "parentCode": "10000",
  34. "name": "惠普笔记本",
  35. "id": 4
  36. }
  37. ],
  38. "parentCode": "0",
  39. "name": "电脑",
  40. "id": 1
  41. }
  42. ]

注意事项

使用mybatis时如加载不到mapper xml需在pom.xml添加以下配置:

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <filtering>true</filtering>
  5. </resource>
  6. <resource>
  7. <directory>src/main/java</directory>
  8. <includes>
  9. <include>**/*.xml</include>
  10. </includes>
  11. </resource>
  12. </resources>
  13.  

总结

使用递归方式是比较常见的方式,优点是实现简单,直观的体现层级关系,但是数据量大的情况下效率会略低;欢迎使用其他方式的小伙伴分享自己的实现思路。

到此这篇关于springboot+mybatis plus实现树形结构查询的文章就介绍到这了,更多相关springboot 树形结构查询内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号