网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Category selectByPrimaryKey(Integer id); //根据主键id查询对应的商品分类记录
int updateByPrimaryKeySelective(Category record); //选择性地更新商品分类记录,只更新非空字段
int updateByPrimaryKey(Category record); //更新商品分类记录的所有字段
List<Category> selectAll(); //查询所有的商品分类记录,返回一个商品分类列表
}
上面的代码是一个名为`CategoryMapper`的接口,它定义了对商品分类数据进行操作的方法。这些方法定义了对商品分类表的常见操作,包括插入、更新、删除和查询等。它们提供了对商品分类数据的基本访问功能,供其他组件(如服务层)使用。实际的数据操作逻辑需要在`CategoryMapper`的实现类中进行实现。
关于这些方法的实现类真的很复杂,我的建议是了解一下就好,不算太重点,实现类其实就长这样:
![](https://img-blog.csdnimg.cn/direct/9ae96bafe37449aea6e3f2bc411572f7.png)
Dao层设计好了我们接着来设计service层
### 设计service层
package com.imooc.mall.service;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import java.util.List;
import java.util.Set;
public interface ICategoryService {
ResponseVo<List<CategoryVo>> selectAll();
void findSubCategoryId(Integer id, Set<Integer> resultSet);
}
上面的代码是一个名为`ICategoryService`的接口,它定义了商品分类相关的服务方法。
这些方法定义了商品分类服务的功能,主要用于查询和处理商品分类相关的业务逻辑。
`selectAll()`方法用于获取所有商品分类的信息,而`findSubCategoryId()`方法用于查找指定分类下的所有子分类的主键id。这些方法可以被其他组件(如控制器层)调用,以实现具体的业务需求。
这里只提供了接口定义,并没有给出具体的实现逻辑。实际的业务逻辑需要在`ICategoryService`的实现类中进行编写。我们接下来就讲讲怎么编写这些实现类。
package com.imooc.mall.service.impl;
import com.imooc.mall.dao.CategoryMapper;
import com.imooc.mall.pojo.Category;
import com.imooc.mall.service.ICategoryService;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.imooc.mall.consts.MallConst.ROOT_PARENT_ID;
@Service
public class CategoryServiceImpl implements ICategoryService {
@Autowired
private CategoryMapper categoryMapper;
/**
* 耗时:http(请求微信api) > 磁盘 > 内存
* mysql(内网+磁盘)
* @return
*/
@Override
public ResponseVo<List<CategoryVo>> selectAll() {
List<Category> categories = categoryMapper.selectAll();
//查出parent_id=0
// for (Category category : categories) {
// if (category.getParentId().equals(ROOT_PARENT_ID)) {
// CategoryVo categoryVo = new CategoryVo();
// BeanUtils.copyProperties(category, categoryVo);
// categoryVoList.add(categoryVo);
// }
// }
//lambda + stream
List<CategoryVo> categoryVoList = categories.stream()
.filter(e -> e.getParentId().equals(ROOT_PARENT_ID))
.map(this::category2CategoryVo)
.sorted(Comparator.comparing(CategoryVo::getSortOrder).reversed())
.collect(Collectors.toList());
//查询子目录
findSubCategory(categoryVoList, categories);
return ResponseVo.success(categoryVoList);
}
@Override
public void findSubCategoryId(Integer id, Set<Integer> resultSet) {
List<Category> categories = categoryMapper.selectAll();
findSubCategoryId(id, resultSet, categories);
}
private void findSubCategoryId(Integer id, Set<Integer> resultSet, List<Category> categories) {
for (Category category : categories) {
if (category.getParentId().equals(id)) {
resultSet.add(category.getId());
findSubCategoryId(category.getId(), resultSet, categories);
}
}
}
private void findSubCategory(List<CategoryVo> categoryVoList, List<Category> categories) {
for (CategoryVo categoryVo : categoryVoList) {
List<CategoryVo> subCategoryVoList = new ArrayList<>();
for (Category category : categories) {
//如果查到内容,设置subCategory, 继续往下查
if (categoryVo.getId().equals(category.getParentId())) {
CategoryVo subCategoryVo = category2CategoryVo(category);
subCategoryVoList.add(subCategoryVo);
}
subCategoryVoList.sort(Comparator.comparing(CategoryVo::getSortOrder).reversed());
categoryVo.setSubCategories(subCategoryVoList);
findSubCategory(subCategoryVoList, categories);
}
}
}
private CategoryVo category2CategoryVo(Category category) {
CategoryVo categoryVo = new CategoryVo();
BeanUtils.copyProperties(category, categoryVo);
return categoryVo;
}
}
我说实话,这里的实现类确实是有点难以理解的,所以我的建议是能看懂最好,看不懂就放一放,到时候等对项目有一个整体的了解再看也不迟。现在你要知道的就是service层有两个方法,一个方法是获取所有商品的分类信息,另一个方法是查找指定分类下的所有子分类的主键id。
设计完service层之后,我们来设计controller层。
### 设计controller层
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新