• Spring+MyBatis使用collection标签的两种使用方法


    目录

    项目场景:

    实战操作:

    1.创建菜单表

    2.创建实体 

    3.创建Mapper

    4.创建xml 

    属性描述:

    效率比较:


    项目场景:

    本文说明了Spring Boot+MyBatis使用collection标签的两种使用方法

    1. 方法一: 关联查询
    2. 方法二: 嵌套select查询


    实战操作:

    1.创建菜单表

    这里只创建一张表,树结构只有两级,方便学习,多表关联是同样的道理

    1. -- ----------------------------
    2. -- Table structure for menu
    3. -- ----------------------------
    4. DROP TABLE IF EXISTS `menu`;
    5. CREATE TABLE `menu`  (
    6.   `id` int(11) NOT NULL AUTO_INCREMENT,
    7.   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色名称',
    8.   `pid` int(3) NULL DEFAULT NULL COMMENT '0代表父级',
    9.   `order` int(3) NULL DEFAULT NULL COMMENT '排序',
    10.   PRIMARY KEY (`id`) USING BTREE
    11. ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    12. -- ----------------------------
    13. -- Records of menu
    14. -- ----------------------------
    15. INSERT INTO `menu` VALUES (1, '审核', 0, 1);
    16. INSERT INTO `menu` VALUES (2, '栏目管理', 0, 2);
    17. INSERT INTO `menu` VALUES (3, '应用审核', 1, 1);
    18. INSERT INTO `menu` VALUES (4, '服务审核', 1, 2);
    19. INSERT INTO `menu` VALUES (5, '角色管理', 2, 1);

    2.创建实体 

    1. package com.test.entity;
    2. import lombok.Data;
    3. import java.util.List;
    4. @Data
    5. public class Menu {
    6. private Integer id;
    7. private String name;
    8. private Integer pid;
    9. private Integer order;
    10. private List menus;
    11. }

    3.创建Mapper

    1. package com.test.dao;
    2. import com.test.entity.Menu;
    3. import java.util.List;
    4. public interface TestMapper{
    5. //关联查询
    6. List selectMenu();
    7. //嵌套查询
    8. List selectNestedMenu();
    9. }

    4.创建xml 

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.test.dao.TestMapper">
    4. <resultMap id="BaseResultMap" type="com.test.entity.Menu">
    5. <result column="id" property="id"/>
    6. <result column="name" property="name"/>
    7. <result column="pid" property="pid"/>
    8. <result column="order" property="order"/>
    9. resultMap>
    10. <resultMap id="MenuResultMap" extends="BaseResultMap" type="com.test.entity.Menu">
    11. <collection ofType="com.test.entity.Menu" resultMap="BaseResultMap" property="menus" columnPrefix="menu_">
    12. collection>
    13. resultMap>
    14. <select id="selectMenu" resultMap="MenuResultMap">
    15. select r.id ,r.name ,r.pid ,r.order ,
    16. r1.id AS menu_id ,r1.name AS menu_name ,r1.pid AS menu_pid,r1.order AS menu_order
    17. FROM menu r
    18. LEFT JOIN menu r1 ON r.id = r1.pid
    19. where r.pid=0
    20. order by r.order,r1.order
    21. select>
    22. <resultMap id="NestedResultMap" extends="BaseResultMap" type="com.test.entity.Menu">
    23. <collection property="menus" column="id" select="selectChildMenu"/>
    24. resultMap>
    25. <select id="selectNestedMenu" resultMap="NestedResultMap">
    26. select r.id ,r.name ,r.pid ,r.order
    27. FROM menu r
    28. where r.pid=0
    29. order by r.order
    30. select>
    31. <select id="selectChildMenu" resultMap="BaseResultMap">
    32. select r.id ,r.name ,r.pid ,r.order
    33. FROM menu r
    34. where r.pid=#{id}
    35. order by r.order
    36. select>
    37. mapper>

    属性描述:

    属性描述
    property属性名:映射实体类属性名
    ofType映射集合的类型(指定一对多的集合里面元素的类型)
    column映射数据库字段名,传多个 {“属性名”=“参数”,“属性名”=“参数”}
    select用于加载复杂类型属性的映射语句的ID(它会从column 属性指定的列中检索数据,作为参数传递给目标 select 语句)
    columnPrefix给关联的数据库中的 column 添加一个前缀(如果不添加前缀,当 两个表同时有 id 字段,查询结果时一定会产生覆盖,使得两个 id 的值一样)

    效率比较:

    方法一(关联查询):只需要执行一次sql语句。
    方法二(嵌套select查询):需要执行多次sql语句。
         
    方法一比方法二的效率要高,但是在使用的时候,方法二的代码可重用性要高

    比如:这里用的是菜单表,数据量不会太大,可以选择方法二(嵌套select查询)

    源码: https://download.csdn.net/download/u011974797/88305627

  • 相关阅读:
    【已解决】qt死活不响应鼠标移动到按钮事件
    进程相关介绍(一)
    nginx降权+匹配php
    剑指 Offer II 014. 字符串中的变位词 滑动窗口
    [Android]打开应用时导航栏闪烁问题分析
    基于Java毕业设计幼儿园教育管理信息系统演示2021源码+系统+mysql+lw文档+部署软件
    月报总结|Moonbeam6月份大事一览
    [Games101] Lecture 03-04 Transformation
    Redis五种基本数据类型-String
    上周热点回顾(4.22-4.28)
  • 原文地址:https://blog.csdn.net/u011974797/article/details/132709944