mybatis-plus-join

Introduction: 支持连表查询的 mybatis-plus,mybatis-plus 风格的连表操作提供 wrapper.leftJoin(),wrapper.rightJoin()等操作
More: Author   ReportBugs   
Tags:

Mybatis-Plus-Join-Logo

MyBatis-Plus-Join

为简化开发工作、提高生产率而生

maven code style

MyBatis-Plus 多表查询的扩展 | 演示工程 | 使用文档 | 点个 Star 支持一下吧 (☆▽☆)

QQ 群:680016987 或者 添加作者微信,备注 MPJ,加入微信群
添加作者微信,备注 MPJ,加入微信群

使用方法

安装

  • Maven
    <dependency>
        <groupId>com.github.yulichang</groupId>
        <artifactId>mybatis-plus-join-boot-starter</artifactId>
        <version>1.4.12</version>
    </dependency>
    
  • Gradle
     implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.12'
    
    或者 clone 代码到本地执行 mvn install, 再引入以上依赖

    注意: MyBatis Plus 版本需要 3.3.0+

使用

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

Lambda 形式用法(MPJLambdaWrapper)

简单的连表查询

class test {
    @Resource
    private UserMapper userMapper;

    void testJoin() {
        //和 Mybatis plus 一致,MPJLambdaWrapper 的泛型必须是主表的泛型,并且要用主表的 Mapper 来调用
        MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
                .selectAll(UserDO.class)//查询 user 表全部字段
                .select(UserAddressDO::getTel)//查询 user_address tel 字段
                .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名
                .select(AreaDO::getProvince, AreaDO::getCity)
                .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
                .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
                .eq(UserDO::getId, 1)
                .like(UserAddressDO::getTel, "1")
                .gt(UserDO::getId, 5);

        //连表查询 返回自定义 ResultType
        List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);

        //分页查询 (需要启用 mybatis plus 分页插件)
        Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper);
    }
}

对应 sql

SELECT  
    t.id, t.name, t.sex, t.head_img, 
    t1.tel, t1.address AS userAddress,
    t2.province, t2.city 
FROM 
    user t 
    LEFT JOIN user_address t1 ON t1.user_id = t.id 
    LEFT JOIN area t2 ON t2.id = t1.area_id 
WHERE (
    t.id = ? 
    AND t1.tel LIKE ? 
    AND t.id > ?)

说明:

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

一对多查询

class test {
    @Resource
    private UserMapper userMapper;

    @Test
    void testResultMap() {
        MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<>(User.class)
                .selectAll(UserDO.class)
                //对多查询
                .selectCollection(AddressDO.class, UesrDTO::getAddressList)
                //对一查询
                .selectAssociation(AddressDO.class, UesrDTO::getAddress)
                .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);

        List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);

        //关于对多分页查询
        //由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
    }
}

MPJLambdaWrapper 其他功能

使用文档 wiki

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools