Java服务端——数据库操作

数据库操作

niucloud 常规数据库操作采用 MyBatis-Plus,MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。针对联表查询使用 MyBatis-Plus-Join,MyBatis-Plus-Join 是一个基于 MyBatis-Plus 的多表查询扩展库。它通过提供简洁的 API 和强大的查询建构器,极大地简化了多表关联查询的复杂性。无论是简单的连表查询还是复杂是一对一、一对多查询,MyBatis-Plus-Join 都能提供优雅的解决方案。本节重点讲解基本数据库增删改查操作,然后下一节数据库查询,单独讲解查询方法。

MyBatis-Plus 与 MyBatis-Plus-Join 介绍

关于 MyBatis-Plus 的优势以及常用方法可以查看 MyBatis-Plus 手册。下面针对 niucloud 中常用数据的增删改查进行讲解。

Mapper层设计

数据库 mapper 继承 Mybatis-Plus 的 BaseMapper,也可以继承 Mybatis-Plus-Join 的 MPJBaseMapper,一般为了后期联表查询方便使用 MPJBaseMapper

例如:

复制代码
package com.niu.shop.mapper.goods;

import com.github.yulichang.base.MPJBaseMapper;
import com.niu.shop.entity.goods.ShopGoodsBrand;
import org.apache.ibatis.annotations.Mapper;

/**
 * 商品品牌 Mapper
 */
@Mapper
public interface ShopGoodsBrandMapper extends MPJBaseMapper<ShopGoodsBrand> {
}

基本增删改查操作

数据添加

数据添加使用 insert 方法,注意 saas 系统站点 id 不是实际参数传入的,而是通过 RequestUtil 获取 siteld

例如下面商品品牌添加:

复制代码
 /**
     * 商品品牌添加
     *
     * @param addParam 参数
     */
    @Override
    public void add(ShopGoodsBrandParam addParam) {
        Long count = shopGoodsBrandMapper.selectCount(new QueryWrapper<ShopGoodsBrand>()
                .eq("brand_name", addParam.getBrandName())
                .eq("site_id", RequestUtils.siteId()));
        if (count > 0) throw new CommonException("品牌已存在");

        ShopGoodsBrand model = new ShopGoodsBrand();

        model.setSiteId(RequestUtils.siteId());
        model.setBrandName(addParam.getBrandName());
        model.setLogo(addParam.getLogo());
        model.setDesc(addParam.getDesc());
        model.setSort(ObjectUtil.isNotEmpty(addParam.getSort()) ? Integer.parseInt(addParam.getSort()) : 0);
        model.setCreateTime(System.currentTimeMillis() / 1000);

        shopGoodsBrandMapper.insert(model);
    }

数据编辑

数据编辑使用 update 方法,如果传入主键 id 编辑使用 updateByld 方法

例如商品品牌编辑部分:

复制代码
  public void edit(Integer id, ShopGoodsBrandParam editParam) {

        ShopGoodsBrand model = shopGoodsBrandMapper.selectOne(
                new QueryWrapper<ShopGoodsBrand>()
                    .eq("brand_id",  id)
                    .eq("site_id", RequestUtils.siteId()));

        Assert.notNull(model, "品牌不存在!");

        model.setBrandName(editParam.getBrandName());
        model.setLogo(editParam.getLogo());
        model.setDesc(editParam.getDesc());
        model.setSort(ObjectUtil.isNotEmpty(editParam.getSort()) ? Integer.parseInt(editParam.getSort()) : 0);
        model.setUpdateTime(System.currentTimeMillis() / 1000);

        shopGoodsBrandMapper.updateById(model);
    }

数据删除

数据删除使用 delete 方法,一般单条删除,传入主键,或者对应条件

例如商品品牌删除:

复制代码
  public void del(Integer id) {
        shopGoodsBrandMapper.delete(new QueryWrapper<ShopGoodsBrand>().eq("brand_id", id).eq("site_id", RequestUtils.siteId()));
    }

数据查询

数据列表分为分页列表查询以及常规列表查询,注意分页列表返回数据结构 PageResult,常规列表直接使用查询的列表即可

关于连表 查询以及查询构造器下节讲解,下面是商品品牌分页列表以及常规列表代码:

复制代码
   /**
     * 商品品牌分页列表
     *
     * @param pageParam 分页参数
     * @param searchParam 搜索参数
     * @return PageResult<ShopGoodsBrandListVo>
     */
    @Override
    public PageResult<ShopGoodsBrandListVo> page(PageParam pageParam, ShopGoodsBrandSearchParam searchParam) {
        Integer page  = pageParam.getPage();
        Integer limit =pageParam.getLimit();

        QueryWrapper<ShopGoodsBrand> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("site_id", RequestUtils.siteId());
        if (ObjectUtil.isNotEmpty(searchParam.getBrandName())) queryWrapper.like("brand_name", searchParam.getBrandName());
        queryWrapper.orderByDesc("brand_id");

        IPage<ShopGoodsBrand> iPage = shopGoodsBrandMapper.selectPage(new Page<>(page, limit), queryWrapper);
        List<ShopGoodsBrandListVo> list = new LinkedList<>();
        for (ShopGoodsBrand item : iPage.getRecords()) {
            ShopGoodsBrandListVo vo = new ShopGoodsBrandListVo();
            BeanUtils.copyProperties(item, vo);
            list.add(vo);
        }
        return PageResult.build(page, limit, iPage.getTotal()).setData(list);
    }

    /**
     * 商品品牌列表
     *
     * @param searchParam 搜索参数
     * @return PageResult<ShopGoodsBrandListVo>
     */
    @Override
    public List<ShopGoodsBrandListVo> list(ShopGoodsBrandSearchParam searchParam) {
        QueryWrapper<ShopGoodsBrand> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("site_id", RequestUtils.siteId());
        if (ObjectUtil.isNotEmpty(searchParam.getBrandName())) queryWrapper.like("brand_name", searchParam.getBrandName());
        queryWrapper.orderByDesc("brand_id");

        List<ShopGoodsBrand> record = shopGoodsBrandMapper.selectList(queryWrapper);
        List<ShopGoodsBrandListVo> list = new LinkedList<>();
        for (ShopGoodsBrand item : record) {
            ShopGoodsBrandListVo vo = new ShopGoodsBrandListVo();
            BeanUtils.copyProperties(item, vo);
            list.add(vo);
        }
        return list;
    }
相关推荐
蜗牛互联网3 分钟前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端
逐光者9338 分钟前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
wuminyu20 分钟前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
天天喝旺仔23 分钟前
MySQL 索引原理与慢查询优化实战:从 B+ 树到执行计划调优
数据库·sql·mysql·性能优化
Sarvartha29 分钟前
内部类知识
java·开发语言
Knight_AL32 分钟前
从 EasyExcel 到 Apache Fesod:Java Excel 处理生态的一次重构
java·apache·excel
yuniko-n37 分钟前
【JUC】集合线程安全
java
liulilittle37 分钟前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
DongQiShanRen1 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
数据库小学妹1 小时前
存算分离到底分离了什么?四条架构变化与选型判断
数据库·数据库架构·云原生数据库·缓存一致性·存算分离