首页 > 数据库 >mybatis-plus 自定义sql拼接 的方式进行Wrapper条件查询 实现了分页 多表查询

mybatis-plus 自定义sql拼接 的方式进行Wrapper条件查询 实现了分页 多表查询

时间:2024-08-02 18:54:53浏览次数:14  
标签:多表 categoryId 自定义 title queryDTO List 查询 id public

法一:用单表的思想(可以跳过,直接看法二)

方法:先收集公共字段到集合中,再批量查询,然后封装起来

缺点:相较于法二,代码量大,多访问了一次数据库

service层:

@Service
@RequiredArgsConstructor
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
    private final ICategoryService categoryService;
    @Override
    public List<ProductVO> searchList(ProductPageQueryDTO queryDTO) {
        // 根据分页查询
        Integer categoryId = queryDTO.getCategoryId();
        String title = queryDTO.getTitle();
        Page<Product> page = lambdaQuery()
                .eq(categoryId != null, Product::getCategoryId, categoryId)
                .like(!StrUtil.isBlank(title), Product::getTitle, title)
                .page(Page.of(queryDTO.getPageNum(), queryDTO.getPageSize()));
        List<Product> records = page.getRecords();

        // 获取商品分类名称
        List<Integer> categoryIds = new ArrayList<>(records.size());
        for (Product record : records) {
            categoryIds.add(record.getCategoryId());
        }
        Map<Integer, String> namesMap = categoryService.getNamesByIds(categoryIds);
        System.out.println(namesMap.get(1));

        // 封装结果
        List<ProductVO> productVOS = BeanUtil.copyToList(records, ProductVO.class);
        for (ProductVO productVO : productVOS) {
            String categoryName = namesMap.get(productVO.getCategoryId());
            productVO.setCategoryName(categoryName);
        }
        return productVOS;
    }
}
@Service
@RequiredArgsConstructor
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {
    private final CategoryMapper categoryMapper;
    

    @Override
    public Map<Integer, String> getNamesByIds(List<Integer> categoryIds) {
        return categoryMapper.getNamesByIds(categoryIds);
    }



}

Mapper层:

public interface CategoryMapper extends BaseMapper<Category> {
    @MapKey("id")
    Map<Integer, String> getNamesByIds(List<Integer> categoryIds);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ptu.mall.mapper.CategoryMapper">

    <select id="getNamesByIds" resultType="map">
        select name
        from category
        where id in
        <foreach collection="categoryIds" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>

</mapper>

法二:

方法:自定义sql拼接mp查询条件

解释:mybatis-plus只要配置了分页插件,当Page进入mapper层时,就会进行分页的sql拼接

Service

@Service
@RequiredArgsConstructor
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
    private final ProductMapper productMapper;
    @Override
    public List<ProductVO> searchListGood(ProductPageQueryDTO queryDTO) {
        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
        Integer categoryId = queryDTO.getCategoryId();
        String title = queryDTO.getTitle();
        wrapper.eq(categoryId != null, Product::getCategoryId, categoryId).
                like(!StrUtil.isBlank(title), Product::getTitle, title);
        Page<ProductVO> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());
        return productMapper.pageQuery(page, wrapper);
    }
}

mapper

public interface ProductMapper extends BaseMapper<Product> {
    List<ProductVO> pageQuery(Page<ProductVO> page, @Param("ew") LambdaQueryWrapper<Product> wrapper);
}

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ptu.mall.mapper.ProductMapper">

    <select id="pageQuery" resultType="com.ptu.mall.domain.vo.ProductVO">
        select p.id as id, p.code as code, p.title as title, p.category_id as categoryId, c.name as categoryName, p.img as img, p.price as price, p.stocks as stocks, p.description as description
        from product p
        left join category c on p.category_id = c.id
        ${ew.customSqlSegment}

    </select>
</mapper>

 

 

标签:多表,categoryId,自定义,title,queryDTO,List,查询,id,public
From: https://blog.csdn.net/CHN_NeverRegret/article/details/140785476

相关文章

  • 微信小程序 自定义 头部导航栏
    最近公司小程序有个需求简单来说就是除开首页和我的页面其他页面左上角都需要有一个返回按钮能返回首页最开始我说的是不用做那两个tabbar页面下面可以点啊结果客户那边非得要没办法客户就是上帝那么话不多说我们直接开干首先是新建一个custom-navbar组件目录结构如......
  • Mysql 常用的性能查询 手段 策略
    1、mysql常用到的慢的查询手段:1.1、日志:binlog日志    慢查询日志     错误日志   errorlog    其他日志2、详细参考:    SHOWGLOBALSTATUSLIKE'%Slow_queries%';     常用系统命令:flushstatustmp_table_siz......
  • 关于自定义实现input
    最近遇到一个功能,让input输入框根据输入内容的多少自己撑开宽度,试了试原生的input标签,发现有默认宽度,所以找了找原理,自己实现一个input实现原理比较简单动态获取dom元素增加input事件然后给想要显示的元素附上输入的内容上效果图截图 上vue2示例代码<template><div>......
  • Android 自定义图片拖动、缩放、旋转
    Android图片拖动、缩放、旋转图片拖动定义一个类,继承AppCompatImageViewpublicclassMyImageViewextendsAppCompatImageView{//实现方法publicMyImageView(Contextcontext){this(context,null);}//实现方法publicMyImageView(Cont......
  • HarmonyOS:如何实现自定义的Tabs,TabContent内部实现如何动态配置
    前言:最近做开发任务的时候,想把Tabs自定义了,并且动态配置TabContent里面的内容,不是写死一样的,这个问题困扰了很长时间,试过**@BuilderParam**(类似于vue的插槽)传组件方式的,但是**@BuilderParam只能传一个,我想要传递的是一个数组,找了很多Api最后找到了WrappedBuilder[]**这种方......
  • ToDesk连接记录查询指南,安全守护远控过程
    当你经常使用远程控制办公,并且连接的设备较多,怎么样才能高效又安全的管理诸多远控设备,保证其远控的安全性?小社长发现ToDesk新版本的连接记录查询功能,可以帮你解决这个难题!这个功能可以让你最快速度找到最近连接的被控设备,并且在移动端上还能查询到被控设备连接的具体时间记录,有......
  • 自定义的 systemd 服务启动方式
    目录systemd单元文件(UnitFile)单元文件结构示例单元文件1.基础单元文件2.带有环境变量的单元文件3.自定义的ExecStartPre和ExecStartPost配置管理日志管理1.系统日志:2.应用程序日志:3.用户日志:使用prometheus配置实例1.配置prometheus2.配置alertmana......
  • SQL SERVER跨服务器查询
    执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。--server124为远程服务器的别名execsp_addlinkedserver'server124','','SQLOLEDB','远程服务器名或ip地址'execsp_addlinkedsrvlogin'server124','false',null,......
  • UE5-自定义插件使用第三方库
    制作插件使用到了第三方库,后面很长时间没有用这个插件,导致插件启用不了,吃亏了,所以记录下制作过程。第一步:在继承ModuleRules的C#脚本里添加代码:privatestringModulePath { get { returnModuleDirectory; } } privatestringThirdPartyPath { get{re......
  • WPF 自定义对话框
    <Windowx:Class="WPFDemo2.窗体.CustomDialogWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas......