網(wǎng)站設(shè)計(jì)制作公司地址網(wǎng)推項(xiàng)目接單平臺(tái)
目錄
項(xiàng)目場(chǎng)景:
實(shí)戰(zhàn)操作:
1.創(chuàng)建菜單表
2.創(chuàng)建實(shí)體?
3.創(chuàng)建Mapper
4.創(chuàng)建xml?
屬性描述:
效率比較:
項(xiàng)目場(chǎng)景:
本文說(shuō)明了Spring Boot+MyBatis使用collection標(biāo)簽的兩種使用方法
1. 方法一: 關(guān)聯(lián)查詢
2. 方法二: 嵌套select查詢
實(shí)戰(zhàn)操作:
1.創(chuàng)建菜單表
這里只創(chuàng)建一張表,樹(shù)結(jié)構(gòu)只有兩級(jí),方便學(xué)習(xí),多表關(guān)聯(lián)是同樣的道理
-- ----------------------------
-- 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代表父級(jí)',`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, '應(yīng)用審核', 1, 1);
INSERT INTO `menu` VALUES (4, '服務(wù)審核', 1, 2);
INSERT INTO `menu` VALUES (5, '角色管理', 2, 1);
2.創(chuàng)建實(shí)體?
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.創(chuàng)建Mapper
package com.test.dao;import com.test.entity.Menu;
import java.util.List;public interface TestMapper{//關(guān)聯(lián)查詢List<Menu> selectMenu();//嵌套查詢List<Menu> selectNestedMenu();
}
4.創(chuàng)建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><!-- 方式一、關(guān)聯(lián)查詢:執(zhí)行一次sql --><!-- 定義resultMap --><resultMap id="MenuResultMap" extends="BaseResultMap" type="com.test.entity.Menu"><!-- 關(guān)聯(lián)集合映射,columnPrefix前綴,用于區(qū)分相同字段 --><collection ofType="com.test.entity.Menu" resultMap="BaseResultMap" property="menus" columnPrefix="menu_"></collection></resultMap><!-- 查詢語(yǔ)句 --><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_orderFROM menu rLEFT JOIN menu r1 ON r.id = r1.pidwhere r.pid=0order by r.order,r1.order</select><!-- 方式二、嵌套查詢:會(huì)執(zhí)行多次sql --><!-- 定義resultMap --><resultMap id="NestedResultMap" extends="BaseResultMap" type="com.test.entity.Menu"><!-- 嵌套查詢集合映射 --><collection property="menus" column="id" select="selectChildMenu"/></resultMap><!-- 查詢所有父級(jí)語(yǔ)句 --><select id="selectNestedMenu" resultMap="NestedResultMap">select r.id ,r.name ,r.pid ,r.orderFROM menu rwhere r.pid=0order by r.order</select><!-- 查詢下級(jí) --><select id="selectChildMenu" resultMap="BaseResultMap">select r.id ,r.name ,r.pid ,r.orderFROM menu rwhere r.pid=#{id}order by r.order</select></mapper>
屬性描述:
屬性 | 描述 |
property | 屬性名:映射實(shí)體類屬性名 |
ofType | 映射集合的類型(指定一對(duì)多的集合里面元素的類型) |
column | 映射數(shù)據(jù)庫(kù)字段名,傳多個(gè) {“屬性名”=“參數(shù)”,“屬性名”=“參數(shù)”} |
select | 用于加載復(fù)雜類型屬性的映射語(yǔ)句的ID(它會(huì)從column 屬性指定的列中檢索數(shù)據(jù),作為參數(shù)傳遞給目標(biāo) select 語(yǔ)句) |
columnPrefix | 給關(guān)聯(lián)的數(shù)據(jù)庫(kù)中的 column 添加一個(gè)前綴(如果不添加前綴,當(dāng) 兩個(gè)表同時(shí)有 id 字段,查詢結(jié)果時(shí)一定會(huì)產(chǎn)生覆蓋,使得兩個(gè) id 的值一樣) |
效率比較:
方法一(關(guān)聯(lián)查詢):只需要執(zhí)行一次sql語(yǔ)句。
方法二(嵌套select查詢):需要執(zhí)行多次sql語(yǔ)句。
? ? ?
方法一比方法二的效率要高,但是在使用的時(shí)候,方法二的代碼可重用性要高比如:這里用的是菜單表,數(shù)據(jù)量不會(huì)太大,可以選擇方法二(嵌套select查詢)
源碼:?https://download.csdn.net/download/u011974797/88305627