Java服务端——数据库操作

数据库操作

niucloud 常规数据库操作采用 MyBatis-PlusMyBatis-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;
    }
相关推荐
东风破_11 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
微尘寒风12 小时前
【Git】的安装和使用
java·git
y = xⁿ12 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
侧耳倾听11113 小时前
jwt使用简介
java·jwt
橙子家13 小时前
OSS 文件上传的几个风险点和解决方案
数据库
顶点多余13 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神14 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_9620664914 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext15 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh