首页 > 其他分享 >Mybatis-Plus-Join(MPJ连表查询)

Mybatis-Plus-Join(MPJ连表查询)

时间:2024-06-17 11:43:33浏览次数:13  
标签:Product Join MPJ class 连表 public OrderDto 查询 Order

mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写上一大段的sql语句

一款叫做mybatis-plus-join的工具(后面就简称mpj了),可以不用在xml编写SQL就可以实现SQL的连接查询,且使用方式类似mybatis-plus中QueryWrapper的方式来进行联表查询了

引入依赖库

<dependency>
    <groupId>com.github.yulichang</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.2.4</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

因为要实现联表查询,所以我们先来建几张表进行测试

订单表

用户表

商品表

修改Mapper接口

以往在使用myatis-plus的时候,我们的Mapper层接口都是直接继承的BaseMapper,使用mpj后需要对其进行修改,改为继承MPJBaseMapper接口

@Mapper
public interface OrderMapper extends MPJBaseMapper<Order> {
}

此外,我们的service也可以选择继承MPJBaseServiceserviceImpl选择继承MPJBaseServiceImpl,这两者为非必须继承

@Service
@AllArgsConstructor
public class OrderServiceImpl implements OrderService {
    private final OrderMapper orderMapper;
}

MPJLambdaWrapper使用

public void getOrder() {
    List<OrderDto> list = orderMapper.selectJoinList(OrderDto.class,
     new MPJLambdaWrapper<Order>()
      .selectAll(Order.class)
      .select(Product::getUnitPrice)
      .selectAs(User::getName,OrderDto::getUserName)
      .selectAs(Product::getName,OrderDto::getProductName)
      .leftJoin(User.class, User::getId, Order::getUserId)
      .leftJoin(Product.class, Product::getId, Order::getProductId)
      .eq(Order::getStatus,3));

    list.forEach(System.out::println);
}

首先,调用mapperselectJoinList()方法,进行关联查询,返回多条结果。后面的第一个参数OrderDto.class代表接收返回查询结果的类,作用和我们之前在xml中写的resultType类似

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class OrderDto extends Order {
    String userName;
    String productName;
    Double unitPrice;
}

接下来的MPJLambdaWrapper就是构建查询条件的核心了,看一下我们在上面用到的几个方法:

  • selectAll():查询指定实体类的全部字段
  • select():查询指定的字段,支持可变长参数同时查询多个字段,但是在同一个select中只能查询相同表的字段,所以如果查询多张表的字段需要分开写
  • selectAs():字段别名查询,用于数据库字段与接收结果的dto中属性名称不一致时转换
  • leftJoin():左连接,其中第一个参数是参与联表的表对应的实体类,第二个参数是这张表联表的ON字段,第三个参数是参与联表的ON的另一个实体类属性

MPJQueryWrapper

和mybatis-plus非常类似,除了LamdaWrapper外还提供了普通QueryWrapper的写法,改造上面的代码

public void getOrderSimple() {
    List<OrderDto> list = orderMapper.selectJoinList(OrderDto.class,
     new MPJQueryWrapper<Order>()
      .selectAll(Order.class)
      .select("t2.unit_price","t2.name as product_name")
      .select("t1.name as user_name")
      .leftJoin("t_user t1 on t1.id = t.user_id")
      .leftJoin("t_product t2 on t2.id = t.product_id")
      .eq("t.status", "3")
    );

    list.forEach(System.out::println);
}

分页查询

mpj中也能很好的支持列表查询中的分页功能,首先我们要在项目中加入分页拦截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}
public void page() {
    IPage<OrderDto> orderPage = orderMapper.selectJoinPage(
      new Page<OrderDto>(2,10),
      OrderDto.class,
      new MPJLambdaWrapper<Order>()
        .selectAll(Order.class)
        .select(Product::getUnitPrice)
        .selectAs(User::getName, OrderDto::getUserName)
        .selectAs(Product::getName, OrderDto::getProductName)
        .leftJoin(User.class, User::getId, Order::getUserId)
        .leftJoin(Product.class, Product::getId, Order::getProductId)
        .orderByAsc(Order::getId));

    orderPage.getRecords().forEach(System.out::println);
}

 

标签:Product,Join,MPJ,class,连表,public,OrderDto,查询,Order
From: https://www.cnblogs.com/liuyangjava/p/18252081

相关文章

  • Java并行世界的钥匙:一文带你了解Java ForkJoin并行框架
    Fork/Join框架是Java7引入的一个并行计算框架,主要用于处理可以通过递归分解成更细小的任务的场景。其基本结构和工作流程可以从以下几个方面进行详细解析:核心类ForkJoinPool:这是一个线程池类,用于执行ForkJoinTask任务。ForkJoinWorkerThread:这是执行任务的具体线程实体......
  • 怎么使用join将数组转为逗号分隔的字符串
    在JavaScript中,你可以使用Array.prototype.join()方法将一个数组转换为逗号分隔的字符串。join()方法接受一个可选的参数,该参数指定了数组元素之间的分隔符。如果不提供参数,则默认使用逗号(,)作为分隔符。下面是一个使用join()方法的例子:letarray=['apple','banana','cher......
  • MySql JOIN
    MySqlJOIN背景最近在做一些项目时需要对数据库进行简单的select,由于之前一直在做HTML+JS+CSS所有对数据库不是很了解,现在从0开始学习,每天学习一点,做个理解总结。有理解偏差欢迎留言指正。简介JOIN用于根据两个或多个表之间关系,查询数据innerjoin内连接leftj......
  • JoinPoint和ProceedingJoinPoint区别
    在Java中,JoinPoint和ProceedingJoinPoint是Aspect-OrientedProgramming(AOP)的概念,通常与AspectJ框架或SpringAOP一起使用。JoinPoint表示一个连接点,即程序执行中的一个具体点,如方法调用或异常处理。ProceedingJoinPoint是JoinPoint的一个子接口,它表示一个可以继续执行......
  • Video Cut Crop Join for Mac(mac视频剪辑合并软件 )v3.9版
    VideoCutCropJoinforMac是一款适用于Mac用户的视频编辑软件。这款软件具有强大的功能,可以帮助用户对视频进行精准的剪切、裁剪,并将其压缩为各种小尺寸和格式,非常适合在网站上分享。VideoCutCropJoinforMac(mac视频剪辑合并软件)软件地址VideoCutCropJoinforM......
  • Pandas碎碎念1 - Dataframe 合并之 join,concat,merge,append
    最近做的几个项目都要经常使用pandas操作excel,中间也遇到了不少坑,简单记录一下吧。套用骁哥的一句话,让自己变得更强!Pandas中有几种常见的合并dataframe的方法,join,concat,merge,append。下面来尝试一下:首先来做一些测试数据data1={'Src':[1,2,3,4],'Mid'......
  • 【MySQL】LEFT JOIN 踩坑
     一、问题发现:主查询功能发现两条一样的记录,但是审批状态不一样,一个已通过,一个待审核 主表付款表:CREATETABLE`pur_or_payment`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'系统编码初始值为“1”',`pa_code`varchar(32)NOTNULLCOMMENT'付款编号',......
  • sleep()、wait()、join()、yield()之间的的区别
    这里提到的sleep()、wait()、join()和yield()是多线程编程中常用的几个方法,它们之间有一些区别:1.sleep():-sleep()方法是Thread类的静态方法,用于让当前线程暂停执行指定的时间。-调用sleep()方法时,当前线程会暂停执行,但不会释放对象锁。-sleep()只会暂停当前......
  • JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例
      SumTask.javaimportjava.util.concurrent.RecursiveTask;/***定义任务和拆分逻辑*RecursiveTask<Long>这个是有返回值的*如果不需要返回值可以用RecursiveAction*/publicclassSumTaskextendsRecursiveTask<Long>{/***累加的开始值......
  • 计算机系统结构之FORK和JOIN
    程序语言中用FORK语句派生并行任务,用JOIN语句对多个并发任务汇合。FORK语句的形式为FORKm,其中m为新领程开始的标号。JOIN语句的形式为JOINn,其中n为并发进程的个数。例1:给定算术表达式Z=E+A*B*C/D+F经并行编译得到如下程序:S1G=A*BS2H=C/DS3I=G*HS4J=E+FS5Z=I+J......