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

这篇具有很好参考价值的文章主要介绍了Spring+MyBatis使用collection标签的两种使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目场景:

实战操作:

1.创建菜单表

2.创建实体 

3.创建Mapper

4.创建xml 

属性描述:

效率比较:


项目场景:

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

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


实战操作:

1.创建菜单表

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

-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色名称',
  `pid` int(3) NULL DEFAULT NULL COMMENT '0代表父级',
  `order` int(3) NULL DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of menu
-- ----------------------------
INSERT INTO `menu` VALUES (1, '审核', 0, 1);
INSERT INTO `menu` VALUES (2, '栏目管理', 0, 2);
INSERT INTO `menu` VALUES (3, '应用审核', 1, 1);
INSERT INTO `menu` VALUES (4, '服务审核', 1, 2);
INSERT INTO `menu` VALUES (5, '角色管理', 2, 1);

Spring+MyBatis使用collection标签的两种使用方法,后端,spring,mybatis,collection,嵌套查询

2.创建实体 

package com.test.entity;

import lombok.Data;
import java.util.List;

@Data
public class Menu {

    private Integer id;
    private String name;
    private Integer pid;
    private Integer order;

    private List<Menu> menus;

}

3.创建Mapper

package com.test.dao;

import com.test.entity.Menu;
import java.util.List;

public interface TestMapper{
    //关联查询
	List<Menu> selectMenu();
    //嵌套查询
	List<Menu> selectNestedMenu();
}

4.创建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.test.dao.TestMapper">
    <!-- 公共字段 -->
    <resultMap id="BaseResultMap" type="com.test.entity.Menu">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pid" property="pid"/>
        <result column="order" property="order"/>
    </resultMap>

    <!-- 方式一、关联查询:执行一次sql -->
    <!-- 定义resultMap -->
    <resultMap id="MenuResultMap" extends="BaseResultMap" type="com.test.entity.Menu">
        <!-- 关联集合映射,columnPrefix前缀,用于区分相同字段 -->
        <collection ofType="com.test.entity.Menu" resultMap="BaseResultMap" property="menus" columnPrefix="menu_">
        </collection>
    </resultMap>

    <!-- 查询语句 -->
    <select id="selectMenu" resultMap="MenuResultMap">
        select r.id ,r.name ,r.pid ,r.order ,
               r1.id AS menu_id ,r1.name AS menu_name ,r1.pid AS menu_pid,r1.order AS menu_order
        FROM menu r
        LEFT JOIN menu r1 ON r.id = r1.pid
        where r.pid=0
        order by r.order,r1.order
    </select>

    <!-- 方式二、嵌套查询:会执行多次sql -->
    <!-- 定义resultMap -->
    <resultMap id="NestedResultMap" extends="BaseResultMap" type="com.test.entity.Menu">
        <!-- 嵌套查询集合映射 -->
        <collection property="menus" column="id" select="selectChildMenu"/>
    </resultMap>

    <!-- 查询所有父级语句 -->
    <select id="selectNestedMenu" resultMap="NestedResultMap">
        select r.id ,r.name ,r.pid ,r.order
        FROM menu r
        where r.pid=0
        order by r.order
    </select>

    <!-- 查询下级 -->
    <select id="selectChildMenu" resultMap="BaseResultMap">
        select r.id ,r.name ,r.pid ,r.order
        FROM menu r
        where r.pid=#{id}
        order by r.order
    </select>

</mapper>

属性描述:

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

效率比较:

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

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

源码: https://download.csdn.net/download/u011974797/88305627文章来源地址https://www.toymoban.com/news/detail-705031.html

到了这里,关于Spring+MyBatis使用collection标签的两种使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java基础:Collections.sort的两种用法详解

    Collections是⼀个⼯具类,sort是其中的静态⽅法,是⽤来对 List 类型进⾏排序的,它有两种参数形式:

    2024年02月10日
    浏览(9)
  • 在较新版pycharm中使用conda虚拟环境的两种方法-保姆级教程

    在较新版pycharm中使用conda虚拟环境的两种方法-保姆级教程

    首先创建new-project 之后等待配置索引等文件即可。 在终端terminal中直接使用conda activate xxx,但是失效。 解决方法: file-settings-Tools-Terminal 之后一定要记得 重启! 然后就好了: 之后conda activate xxx(你的虚拟环境),在里面运行你的python文件即可(python xxx.py --xxx) 如果是这样创建的

    2024年02月09日
    浏览(15)
  • 制作Windows 11的U盘启动工具的两种方法,以及如何使用它来安装

    制作Windows 11的U盘启动工具的两种方法,以及如何使用它来安装

    本文介绍了如何创建Windows 11的U盘启动工具,以及如何使用它来安装Windows 11。 微软网站上提供的Windows 11 Media Creation Tool可以帮助你创建Windows 11的U盘启动工具。它真的很容易使用,因为它可以引导你完成所有的步骤。 1、访问Microsoft下载Windows 11的页面,然后从创建Windows 11安装

    2024年02月05日
    浏览(6)
  • 使用c语言编程时输入具体的年份和月份,求月份的天数的两种编程方法

    使用c语言编程时输入具体的年份和月份,求月份的天数的两种编程方法

    方法一:使用if……else语句  方法二:使用switch语句 考虑到一些读者需要相关资料和解决一些疑问,因此我新建立了一个学习交流群,我在群文件里上传了一些资料,需要的读者可以入群下载。 群中文件资料我会时常更新,主要资料是51单片机开发、32单片机开发、编程、嵌

    2024年02月11日
    浏览(5)
  • Mybatis中 collection 和 association 标签 的区别

    Mybatis中 collection 和 association 标签 的区别

    collection 和 association 是 MyBatis 中用于定义映射关系的标签,它们的区别如下: 目标对象类型: collection 用于表示集合属性,即一个属性对应多个关联对象。 association 用于表示关联属性,即一个属性对应一个关联对象。 关联关系处理: collection 用于处理一对多或多对多的关联

    2024年02月09日
    浏览(22)
  • 使用Qt Designer为您的Qt for Python项目创建基于Qt Widgets的图形界面的两种方法

    使用Qt Designer为您的Qt for Python项目创建基于Qt Widgets的图形界面的两种方法

    本页介绍如何使用Qt Designer为您的Qt for Python项目创建基于Qt Widgets的图形界面。Qt Designer是一个图形UI设计工具,可以作为独立的二进制文件(pyside6-designer)提供,也可以嵌入到Qt Creator IDE中。它在Qt Creator中的使用在Using Qt Designer中描述。 设计存储在.ui文件中,这是一种基于

    2024年02月07日
    浏览(5)
  • 解决使用echarts时警告There is a chart instance already initialize on the dom.的两种方法

    第一种 使用dispose()方法清除实例 第二种 使用 echarts.getInstanceByDom()方法 echarts.getInstanceByDom()这个方法用来获取Dom容器上的实例,如果存在实例就直接使用已存在的实例进行编辑,如果没有就创建新实例进行编辑。

    2024年02月13日
    浏览(9)
  • Mybatis查树的两种写法

    Mybatis查树的两种写法

    Mybatis查树必须会,它有两种写法: 1、联表查询。只访问一次数据库。 2、递归查询。访问多次数据库。 表结构: mapper: xxMapper.xml 这种写法,注意collection里面的字段不能和外面的相同,所以这里取了别名region_name2,但是属性是可以重复的。 像这种树的,要求的字段返回不会

    2024年02月06日
    浏览(7)
  • MyBatis-plus中的两种快捷操作数据库方式:1、mapper调用 2、ActiveRecord方式(简称AR) 二者的使用和区别介绍

    MyBatis-plus中的两种快捷操作数据库方式:1、mapper调用 2、ActiveRecord方式(简称AR) 二者的使用和区别介绍

            在使用MyBatis操作数据库时,需要频繁的写mapper层dao接口以及对应的配置文件和SQL语句,当功能方法繁杂,业务逻辑不复杂的时候,我们可以使用MyBatis的升级版MyBatis-Plus来代替我们写这些繁琐的配置文件和简单的SQL。 (1)书写或使用MP生成数据库表对应的实体类。

    2024年02月07日
    浏览(58)
  • Mybatis 的多种标签使用以及 Spring 框架单元测试

    Mybatis 的多种标签使用以及 Spring 框架单元测试

    在讲解 Mybatis 的标签之前, 要先介绍一下另一个 Java 的好帮手 Spring 框架内置的 JUnit 测试框架. 为什么要在 Mybatis 学习之前了解 JUnit 呢 ? 很大一部分原因不仅仅是因为单元测试是写完项目后开发人员自己需要做的, 更重要的是当前阶段学习中, 利用 JUnit 可以更简单的构造数据来

    2024年02月09日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包