leyou_07_对数据的操作

Posted asndxj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leyou_07_对数据的操作相关的知识,希望对你有一定的参考价值。

1.目标在数据库的两张表中拿到以下数据,并完成状态、搜索和分页功能

技术图片

 实体类Spu(页面需要的数据

 技术图片

 实体类Category(页面需要的数据) name:商品分类

技术图片

 2.分析:

返回的数据在两个实体类中,但我们不能修改实体类数据表,需要创建一个Bo实体类将需要的数据合并到一起

技术图片

 3.业务逻辑代码

@Service
public class GoodsService {
    @Autowired
    private SpuMapper supMapper;

    @Autowired
    private BrandMapper brandMapper;

    @Autowired
    private SpuDetailMapper spuDetailMapper;

    @Autowired
    private CategoryService categoryService;

    /**
     * 更具条件分页查询Spu
     * 请求地址: http://api.leyou.com/api/item/spu/page?key=&saleable=true&page=1&rows=5
     *
     * @param key
     * @param saleable
     * @param page
     * @param rows
     * @return
     */
    public PageResult<SpuBo> querySpuByPage(String key, Boolean saleable, Integer page, Integer rows) {
        //添加查询条件
        Example example = new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();

        if (StringUtils.isNotBlank(key)) {
            criteria.andLike("title", "%" + key + "%");
        }
        //添加上下架的过滤条件
        if (saleable != null) {
            criteria.andEqualTo("saleable", saleable);
        }
        //添加分页
        PageHelper.startPage(page, rows);

        //执行查询,获得spu集合
        List<Spu> spus = supMapper.selectByExample(example);
        PageInfo<Spu> spuPageInfo = new PageInfo<>(spus);

        //spu转化为SpuBo
        List<SpuBo> spuBos = spus.stream().map(spu -> {
            SpuBo spuBo = new SpuBo();
            BeanUtils.copyProperties(spu, spuBo);

            Brand brand = brandMapper.selectByPrimaryKey(spu.getBrandId());
            //查询品牌名称
            spuBo.setBname(brand.getName());

            //查询分类名称
            List<String> names = categoryService.queryNameByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));
            spuBo.setCname(StringUtils.join(names, "-"));
            return spuBo;

        }).collect(Collectors.toList());
        //返回pageResult<SpuBo>
        return new PageResult<>(spuPageInfo.getTotal(),spuBos);
    }
}

4.代码分析

1>通过example.createCriteria();拼接查询条件

2>spu代码分析:

BeanUtils.copyProperties(spu, spuBo);

技术图片

 将一个Object对象赋值给一个Object对象

//spu转化为SpuBo
        List<SpuBo> spuBos = spus.stream().map(spu -> {
            SpuBo spuBo = new SpuBo();
            BeanUtils.copyProperties(spu, spuBo);

            Brand brand = brandMapper.selectByPrimaryKey(spu.getBrandId());
            //查询品牌名称
            spuBo.setBname(brand.getName());

            //查询分类名称
            List<String> names = categoryService.queryNameByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));
            spuBo.setCname(StringUtils.join(names, "-"));
            return spuBo;

        }).collect(Collectors.toList());


jdk8的特性stream().map() 将对象转换成另一个对象

List<SpuBo> spuBos = spus.stream().map(spu -> {}).collect(Collectors.toList());
循环List<Spu> spus 集合,将每一项赋值给spu,可以在{}中进行数据处理,最后分装到spuBos集合中去

3>spuBo.setCname(StringUtils.join(names, "-"));

将一个集合中的元素全部用字符串拼接,以"-"为分隔符,并且最后没有"-"号。效果a-b-c

4>selectByIdList(ids)的用法:遍历ids多次执行查询语句

需要继承:public interface CategoryMapper extends Mapper<Category>,SelectByIdListMapper<Category,Long> {
}

selectByIdList(ids):方法的作用

通俗的讲就是:遍历ids中的所有的元素,并执行select查询,返回多个结果封装到集合中

List<Category> categories = categoryMapper.selectByIdList(ids);

 5>Arrays.List(value1,value2,value3...)将value封装到集合中去

 

List<String> names = categoryService.queryNameByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));

 

 

以上是关于leyou_07_对数据的操作的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException: Service id not legal hostname (leyou_item_service)

leyou_04_使用vue.js搭建页面—使用ajax完成品牌的查询

javaSE_07_方法

JavaBasic_07

如何将列表视图中的数据从一个片段发送到另一个片段

[AndroidStudio]_[初级]_[配置自动完成的代码片段]