当前位置:网站首页>连接查询和子查询
连接查询和子查询
2022-07-27 16:18:00 【猫的幻想曲】
一般对分类列表的实现:

连接查询:一次性查询三级分类
优点:只需要一次查询,根据一级分类显示二级分类时相应速度较快
缺点:数据库查询效率低,页面首次加载的速度也相对较慢
子查询:先只查询一级分类,用户点击/鼠标移动到一级分类,动态加载二级分类
优点:数据库查询效率提高,页面首次加载速度提高
缺点:需要多次连接数据库
数据表结构:

封装Category为CategoryVO:(为list集合)
package com.qfedu.fmmall.entity;
import javax.persistence.Column;
import java.util.List;
/**
* @Description:
* @Author : Jerry
* @create : 2022-06-24 18:00
*/
public class CategoryVO {
@Override
public String toString() {
return "CategoryVO{" +
"categoryId=" + categoryId +
", categoryName='" + categoryName + '\'' +
", categoryLevel=" + categoryLevel +
", parentId=" + parentId +
", categoryIcon='" + categoryIcon + '\'' +
", categorySlogan='" + categorySlogan + '\'' +
", categoryPic='" + categoryPic + '\'' +
", categoryBgColor='" + categoryBgColor +
'}';
}
/**
* 主键 分类id主键
*/
@Column(name = "category_id")
private Integer categoryId;
/**
* 分类名称 分类名称
*/
@Column(name = "category_name")
private String categoryName;
/**
* 分类层级 分类得类型,
1:一级大分类
2:二级分类
3:三级小分类
*/
@Column(name = "category_level")
private Integer categoryLevel;
/**
* 父层级id 父id 上一级依赖的id,1级分类则为0,二级三级分别依赖上一级
*/
@Column(name = "parent_id")
private Integer parentId;
/**
* 图标 logo
*/
@Column(name = "category_icon")
private String categoryIcon;
/**
* 口号
*/
@Column(name = "category_slogan")
private String categorySlogan;
/**
* 分类图
*/
@Column(name = "category_pic")
private String categoryPic;
/**
* 背景颜色
*/
@Column(name = "category_bg_color")
private String categoryBgColor;
private List<CategoryVO> categories;
public List<CategoryVO> getCategories() {
return categories;
}
public void setCategories(List<CategoryVO> categories) {
this.categories = categories;
}
/**
* 获取主键 分类id主键
*
* @return category_id - 主键 分类id主键
*/
public Integer getCategoryId() {
return categoryId;
}
/**
* 设置主键 分类id主键
*
* @param categoryId 主键 分类id主键
*/
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
/**
* 获取分类名称 分类名称
*
* @return category_name - 分类名称 分类名称
*/
public String getCategoryName() {
return categoryName;
}
/**
* 设置分类名称 分类名称
*
* @param categoryName 分类名称 分类名称
*/
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
/**
* 获取分类层级 分类得类型,
1:一级大分类
2:二级分类
3:三级小分类
*
* @return category_level - 分类层级 分类得类型,
1:一级大分类
2:二级分类
3:三级小分类
*/
public Integer getCategoryLevel() {
return categoryLevel;
}
/**
* 设置分类层级 分类得类型,
1:一级大分类
2:二级分类
3:三级小分类
*
* @param categoryLevel 分类层级 分类得类型,
1:一级大分类
2:二级分类
3:三级小分类
*/
public void setCategoryLevel(Integer categoryLevel) {
this.categoryLevel = categoryLevel;
}
/**
* 获取父层级id 父id 上一级依赖的id,1级分类则为0,二级三级分别依赖上一级
*
* @return parent_id - 父层级id 父id 上一级依赖的id,1级分类则为0,二级三级分别依赖上一级
*/
public Integer getParentId() {
return parentId;
}
/**
* 设置父层级id 父id 上一级依赖的id,1级分类则为0,二级三级分别依赖上一级
*
* @param parentId 父层级id 父id 上一级依赖的id,1级分类则为0,二级三级分别依赖上一级
*/
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
/**
* 获取图标 logo
*
* @return category_icon - 图标 logo
*/
public String getCategoryIcon() {
return categoryIcon;
}
/**
* 设置图标 logo
*
* @param categoryIcon 图标 logo
*/
public void setCategoryIcon(String categoryIcon) {
this.categoryIcon = categoryIcon;
}
/**
* 获取口号
*
* @return category_slogan - 口号
*/
public String getCategorySlogan() {
return categorySlogan;
}
/**
* 设置口号
*
* @param categorySlogan 口号
*/
public void setCategorySlogan(String categorySlogan) {
this.categorySlogan = categorySlogan;
}
/**
* 获取分类图
*
* @return category_pic - 分类图
*/
public String getCategoryPic() {
return categoryPic;
}
/**
* 设置分类图
*
* @param categoryPic 分类图
*/
public void setCategoryPic(String categoryPic) {
this.categoryPic = categoryPic;
}
/**
* 获取背景颜色
*
* @return category_bg_color - 背景颜色
*/
public String getCategoryBgColor() {
return categoryBgColor;
}
/**
* 设置背景颜色
*
* @param categoryBgColor 背景颜色
*/
public void setCategoryBgColor(String categoryBgColor) {
this.categoryBgColor = categoryBgColor;
}
}
连接查询:(演示三级查询)
categoryMapper接口:
package com.qfedu.fmmall.dao;
import com.qfedu.fmmall.entity.Category;
import com.qfedu.fmmall.entity.CategoryVO;
import com.qfedu.fmmall.general.GeneralDAO;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CategoryMapper extends GeneralDAO<Category> {
//1.使用连接查询实现分类查询:3级查询
public List<CategoryVO> selectAllCategories();
//2.子查询:根据parentId查询子分类
public List<CategoryVO> selectAllCategories2(int parentId);
}Mapper文件:
<resultMap id="categoryVOMap" type="com.qfedu.fmmall.entity.CategoryVO">
<result column="category_id1" jdbcType="INTEGER" property="categoryId" />
<result column="category_name1" jdbcType="VARCHAR" property="categoryName" />
<result column="category_level1" jdbcType="INTEGER" property="categoryLevel" />
<result column="parent_id1" jdbcType="INTEGER" property="parentId" />
<result column="category_icon1" jdbcType="VARCHAR" property="categoryIcon" />
<result column="category_slogan1" jdbcType="VARCHAR" property="categorySlogan" />
<result column="category_pic1" jdbcType="VARCHAR" property="categoryPic" />
<result column="category_bg_color1" jdbcType="VARCHAR" property="categoryBgColor" />
<collection property="categories" ofType="com.qfedu.fmmall.entity.CategoryVO">
<result column="category_id2" jdbcType="INTEGER" property="categoryId" />
<result column="category_name2" jdbcType="VARCHAR" property="categoryName" />
<result column="category_level2" jdbcType="INTEGER" property="categoryLevel" />
<result column="parent_id2" jdbcType="INTEGER" property="parentId" />
<collection property="categories" ofType="com.qfedu.fmmall.entity.CategoryVO">
<result column="category_id3" jdbcType="INTEGER" property="categoryId" />
<result column="category_name3" jdbcType="VARCHAR" property="categoryName" />
<result column="category_level3" jdbcType="INTEGER" property="categoryLevel" />
<result column="parent_id3" jdbcType="INTEGER" property="parentId" />
</collection>
</collection>
</resultMap>
<select id="selectAllCategories" resultMap="categoryVOMap">
select
c1.category_id 'category_id1',
c1.category_name 'category_name1',
c1.category_level 'category_id1',
c1.parent_id 'parent_id1',
c1.category_icon 'category_icon1',
c1.category_slogan 'category_slogan1',
c1.category_pic 'category_pic1',
c1.category_bg_color 'category_bg_color1',
c2.category_id 'category_id2',
c2.category_name 'category_name2',
c2.category_level 'category_level2',
c2.parent_id 'parent_id2',
c3.category_id 'category_id3',
c3.category_name 'category_name3',
c3.category_level 'category_level3',
c3.parent_id 'parent_id3'
from category c1
left join category c2 on c2.parent_id=c1.category_id
left join category c3 on c3.parent_id=c2.category_id
where c1.category_level=1
</select>测试:
package com.qfedu;
import com.qfedu.fmmall.dao.CategoryMapper;
import com.qfedu.fmmall.entity.CategoryVO;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApiApplication.class)
class ApiApplicationTests {
@Autowired
private CategoryMapper categoryMapper;
@Test
void contextLoads() {
List<CategoryVO> categoryVOS = categoryMapper.selectAllCategories();
for(CategoryVO c1 : categoryVOS){
System.out.println(c1);
for(CategoryVO c2 : c1.getCategories()){
System.out.println("\t" + c2);
for(CategoryVO c3 : c2.getCategories()){
System.out.println("\t\t" + c3);
}
}
}
}
}
测试结果:
子查询:
categoryMapper接口:
package com.qfedu.fmmall.dao;
import com.qfedu.fmmall.entity.Category;
import com.qfedu.fmmall.entity.CategoryVO;
import com.qfedu.fmmall.general.GeneralDAO;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CategoryMapper extends GeneralDAO<Category> {
//1.使用连接查询实现分类查询:3级查询
public List<CategoryVO> selectAllCategories();
//2.子查询:根据parentId查询子分类
public List<CategoryVO> selectAllCategories2(int parentId);
}Mapper文件:
<resultMap id="categoryVOMap2" type="com.qfedu.fmmall.entity.CategoryVO">
<result column="category_id" jdbcType="INTEGER" property="categoryId" />
<result column="category_name" jdbcType="VARCHAR" property="categoryName" />
<result column="category_level" jdbcType="INTEGER" property="categoryLevel" />
<result column="parent_id" jdbcType="INTEGER" property="parentId" />
<result column="category_icon" jdbcType="VARCHAR" property="categoryIcon" />
<result column="category_slogan" jdbcType="VARCHAR" property="categorySlogan" />
<result column="category_pic" jdbcType="VARCHAR" property="categoryPic" />
<result column="category_bg_color" jdbcType="VARCHAR" property="categoryBgColor" />
<collection property="categories" column="category_id" select="com.qfedu.fmmall.dao.CategoryMapper.selectAllCategories2"/>
</resultMap>
<!--根据父级分类的id查询子级分类-->
<select id="selectAllCategories2" resultMap="categoryVOMap2">
select
category_id,
category_name,
category_level,
parent_id,
category_icon,
category_slogan,
category_pic,
category_bg_color
from category
where parent_id=#{parentId}
</select>测试:
package com.qfedu;
import com.qfedu.fmmall.dao.CategoryMapper;
import com.qfedu.fmmall.entity.CategoryVO;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApiApplication.class)
class ApiApplicationTests {
@Autowired
private CategoryMapper categoryMapper;
@Test
void contextLoads() {
List<CategoryVO> categoryVOS = categoryMapper.selectAllCategories2(0);
for(CategoryVO c1 : categoryVOS){
System.out.println(c1);
for(CategoryVO c2 : c1.getCategories()){
System.out.println("\t" + c2);
for(CategoryVO c3 : c2.getCategories()){
System.out.println("\t\t" + c3);
}
}
}
}
}
测试结果:

总结:
数据大的用子查询较好,对数据库的查询效率高;数据较少时用连续查询较好,可一次性查询所有数据。
连续查询和子查询的作用一样,都是先从一级查询入手,从而进行查询,但是实战效果不一样,两种方法可相互借鉴。
边栏推荐
- 2021.8.6 notes jsoup
- ValueError: Found input variables with inconsistent numbers of samples: [80019456, 26673152]【报错】
- Using Jieba and pyhanlp tools to extract keyword words and sentences
- 搭建一个简单的知识问答系统
- nacos显示服务注册地址错误
- 知识图谱 — jieba、pyhanlp、smoothnlp工具实现中文分词(词性表)
- Log4j epic loopholes, big companies like jd.com have been recruited
- Basic operations of MySQL view
- An analysis of CPU explosion of a smart logistics WCS system in.Net
- MySQL basic statement
猜你喜欢

Navicat 导出表生成PDM文件

如何实现Word、PDF、TXT文件的全文内容检索?

Error launching IDEA

Let's move forward together, the 10th anniversary of Google play!

Ant privacy computing innovation tee technology has won academic recognition

uniapp H5跨域问题

Complete set of machine learning classification task effect evaluation indicators (including ROC and AUC)

解决Jsp级联问题

2021.7.13 note sub query

全自动吸奶器芯片-DLTAP703SD
随机推荐
Commonly used built-in methods of mybtis plus
Class not found: "the com.parkmanagement.dao.daotest test cannot find the test class
2021.7.19 notes DML
家用静音驱蚊灯芯片-DLTAP703SD-杰力科创
INSUFFICIENT_ ACCESS_ ON_ CROSS_ REFERENCE_ ENTITY APEX / SALESFORCE
MySQL basic statement
我人都傻了,CompletableFuture和OpenFegin一起使用竟然报错
MySQL 主从复制数据不一致,怎么办?
Installation and deployment of zabbix6.0
2021.7.13 note sub query
阿里架构师耗时280个小时整理的1015页分布式全栈小册,轻松入手分布式系统
Uni app for wechat login (to be finished)
Modify placeholder style in input
uniapp H5跨域问题
2021.8.1 notes DBA
Ant privacy computing innovation tee technology has won academic recognition
pygame飞机大战游戏背景实现
Part of speech list of common words
2021.7.17 notes MySQL other commands
MySQL set validate_ Adding skip grant tables after password=off failed to start the service