明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 320万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

Posted on   且行且思  阅读(488)  评论(0编辑  收藏  举报

引入依赖

首先在项目中引入引入依赖坐标,因为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);
}
复制代码

 

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示