zoukankan      html  css  js  c++  java
  • Mybatis-Plus

    前言

    记录下Mybatis-Plus中条件构造器Wrapper 的一些基本用法。


    查询示例

    • 表结构
    CREATE TABLE `product` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
      `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    
    CREATE TABLE `product_item` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
      `product_id` int(10) unsigned NOT NULL,
      `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    
    • 实现需求:根据product - id查询product实例及其关联的product_item,如下:

    在这里插入图片描述

    基础代码

    • ProductController.java
    @GetMapping("/{id}")
    public ProductWithItemsVo getWithItems(@PathVariable Integer id) {
       return productService.getWithItems(id);
    }
    
    • ProductService.java
    public interface ProductService {
        ProductWithItemsVo getWithItems(Integer id);
    }
    
    • ProductServiceImpl.java
    @Service
    public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
    	@Autowired
        private ProductItemMapper productItemMapper;
    
    	@Override
        public ProductWithItemsVo getWithItems(Integer id) {
        	// 实现代码
        }
    }
    
    • mapper
    @Repository
    public interface ProductMapper extends BaseMapper<Product> {
    
    }
    
    @Repository
    public interface ProductItemMapper extends BaseMapper<ProductItem> {
    
    }
    
    • model
    @Getter
    @Setter
    @TableName("product")
    public class Product {
    
        private Integer id;
    
        private String title;
    
        @JsonIgnore
        private Date createTime;
    
    }
    
    @Getter
    @Setter
    @TableName("product_item")
    public class ProductItem {
    
        private Integer id;
    
        private Integer productId;
    
        private String title;
    
        @JsonIgnore
        private Date createTime;
    }
    
    • vo出参
    @Data
    @NoArgsConstructor
    public class ProductWithItemsVo {
    
        private Integer id;
    
        private String title;
    
        List<ProductItem> items;
    
    	/**
         * 构造ProductWithItemsVo对象用于出参
         * @param product
         * @param items
         */
        public ProductWithItemsVo(Product product, List<ProductItem> items) {
            BeanUtils.copyProperties(product, this);
            this.setItems(items);
        }
    }
    

    QueryWrapper 的基本使用

    @Override
    public ProductWithItemsVo getWithItems(Integer id) {
        Product product = this.getById(id);
        if (Objects.isNull(product)) {
            System.out.println("未查询到product");
            return null;
        }
    
        /**
         * wrapper.eq("banner_id", id)
         * banner_id 数据库字段
         * id 判断相等的值
         */
        QueryWrapper<ProductItem> wrapper = new QueryWrapper<>();
        wrapper.eq("product_id", id);
        List<ProductItem> productItems = productItemMapper.selectList(wrapper);
    
        return new ProductWithItemsVo(product, productItems);
    }
    
    • 如上代码,通过条件构造器QueryWrapper查询出当前product实例及其关联的product_item

    QueryWrapper 的lambada写法

    @Override
        public ProductWithItemsVo getWithItems(Integer id) {
            Product product = this.getById(id);
            if (Objects.isNull(product)) {
                System.out.println("未查询到product");
                return null;
            }
    
            QueryWrapper<ProductItem> wrapper = new QueryWrapper<>();
            /**
             * lambda方法引用
             */
            wrapper.lambda().eq(ProductItem::getProductId, id);
            List<ProductItem> productItems = productItemMapper.selectList(wrapper);
    
            return new ProductWithItemsVo(product, productItems);
        }
    
    • 如上代码,通过条件构造器QueryWrapperlambda方法引用查询出当前product实例及其关联的product_item

    LambadaQueryWrapper 的使用

    • LambadaQueryWrapper 用于Lambda语法使用的QueryWrapper
    • 构建LambadaQueryWrapper 的方式:
     /**
       * 方式一
       */
      LambdaQueryWrapper<ProductItem> wrapper1 = new QueryWrapper<ProductItem>().lambda();
      wrapper1.eq(ProductItem::getProductId, id);
      List<ProductItem> productItems1 = productItemMapper.selectList(wrapper1);
    
      /**
       * 方式二
       */
      LambdaQueryWrapper<ProductItem> wrapper2 = new LambdaQueryWrapper<>();
      wrapper2.eq(ProductItem::getProductId, id);
      List<ProductItem> productItems2 = productItemMapper.selectList(wrapper2);
    
    • 完整代码
    @Override
    public ProductWithItemsVo getWithItems(Integer id) {
        Product product = this.getById(id);
        if (Objects.isNull(product)) {
            System.out.println("未查询到product");
            return null;
        }
    
        LambdaQueryWrapper<ProductItem> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ProductItem::getProductId, id);
        List<ProductItem> productItems = productItemMapper.selectList(wrapper);
    
        return new ProductWithItemsVo(product, productItems);
    }
    
    • 如上代码,通过条件构造器LambdaQueryWrapper查询出当前product实例及其关联的product_item

    LambdaQueryChainWrapper 的链式调用

    @Override
        public ProductWithItemsVo getWithItems(Integer id) {
            Product product = this.getById(id);
            if (Objects.isNull(product)) {
                System.out.println("未查询到product");
                return null;
            }
    
            /**
             * 链式调用
             */
            List<ProductItem> productItems =
                    new LambdaQueryChainWrapper<>(productItemMapper)
                            .eq(ProductItem::getProductId, id)
                            .list();
    
            return new ProductWithItemsVo(product, productItems);
        }
    
    • 如上代码,通过链式调用查询出当前product实例及其关联的product_item

    - End -
    梦想是咸鱼
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    JAVA线程池
    数据库三范式和反三范式
    nvm切换node的版本
    vue源码解析一
    css实现气泡样式
    openlayer 地图实现圈选框选清楚 选择地图区域
    vs code开发常用插件
    记录几个好用的工具
    03 使用css改变页面样式
    02 常用的html元素
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15239402.html
Copyright © 2011-2022 走看看