MybatisPlus封装的mapper不支持 join,那咋办

发布时间 2023-11-22 10:34:40作者: 且行且思

引入依赖

首先在项目中引入引入依赖坐标,因为mpj中依赖较高版本mybatis-plus中的一些api,所以项目建议直接使用高版本。

maven

<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>

 

引入相关依赖后,在springboot项目中,像往常一样正常配置数据源连接信息就可以了。

import com.github.yulichang.wrapper.MPJLambdaWrapper;

 

使用

    mapper继承MPJBaseMapper (必选)
    service继承MPJBaseService (可选)
    serviceImpl继承MPJBaseServiceImpl (可选)

核心类MPJLambdaWrapper和MPJQueryWrapper
MPJLambdaWrapper用法
简单的三表查询

        MPJLambdaWrapper<ProCard> wrapper = new MPJLambdaWrapper<ProCard>()
                .selectAll(ProCard.class)//查询user表全部字段
                .select(ProCard::getProcId)//查询user_address tel 字段
                //.selectAs(UserAddressDO::getProcGytdzheng, UserDTO::getProcGytdzheng)//别名 t.address AS userAddress
                //.select(AreaDO::getProvince, AreaDO::getCity)
                .leftJoin(ProProject.class, ProCard::getProcProjectid, ProProject::getPropProjectid) //左连接查询,相当于 left join ProProject on ProCard.ProcProjectid=ProProject.PropProjectid
                //.leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
                .eq(ProCard::getId, 1)            //where条件1
                .like(UserAddressDO::getTel, "1") //where条件2
                .gt(ProCard::getId, 5);           //EQ:等于|NE:不等于|GT:大于|LT:小于|GE:大于等于|LE:小于等于

 

 

说明:

    UserDTO.class 查询结果返回类(resultType)
    selectAll() 查询指定实体类的全部字段
    select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
    selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
    leftJoin() 参数说明;第一个参数: 参与连表的实体类class 第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性 第三个参数: 参与连表的ON的另一个实体类属性
    默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
    条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险

MPJLambdaWrapper 还有很多其他的功能

    简单的SQL函数使用:https://gitee.com/best_handsome/mybatis-plus-join/wikis/selectFunc()?sort_id=4082479
    ON语句多条件支持:https://gitee.com/best_handsome/mybatis-plus-join/wikis/leftJoin?sort_id=3496671

MPJLambdaWrapper其他功能

    一对一,一对多使用:https://ylctmh.com/pages/core/lambda/select/selectCollection.html
    简单的SQL函数使用:https://ylctmh.com/pages/core/lambda/select/selectFunc.html
    ON语句多条件支持:https://ylctmh.com/pages/core/lambda/join/leftJoin.html

分页查询

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

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

接下来改造上面的代码,调用selectJoinPage()方法:

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);
}