2021-01-28 14:40:48 +08:00
2021-01-28 14:35:01 +08:00
2021-01-28 14:40:48 +08:00
2021-01-28 14:35:01 +08:00
2021-01-28 14:35:01 +08:00

mybatis-plus-join

支持连表查询的mybatis-plus

运行环境

  • mysql8
  • jdk8
  • mybatis-plus 3.4.2

使用方法

  1. 将代码down到本地使用maven install

  2. 在自己的项目中替换mybatisplus依赖(框架依赖mybatisplus<3.4.2>)

    <dependency>
        <groupId>com.github.mybatisplus</groupId>
        <artifactId>join</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    

使用

  • entity继承MyBaseEntity (需要连表的实体类必须继承,其他可以不继承)
  • mapper继承MyBaseMapper (必选)
  • service继承MyBaseService (可选)
  • serviceImpl继承MyBaseServiceImpl (可选)

MyLambdaQueryWrapper用法

select(UserEntity::getId) 查询指定的字段,支持可变参数

查询user表中的head_img,name和user_address表中的address,tel

class test {
    @Resource
    private UserMapper userMapper;
    
    void testJoin() {
        List<UserDTO> list = userMapper.selectJoinList(new MyLambdaQueryWrapper<UserEntity>()
                        .select(UserEntity::getHeadImg, UserEntity::getName)
                        .leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
                                right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel))
                , UserDTO.class);
    }
}

对应sql

SELECT 
    t0.head_img,
    t0.name,
    t1.address,
    t1.tel
FROM 
user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id

selectAll(UserEntity.class) 查询UserEntity全部字段

查询user全部字段和user_address表中的address,tel

class test {
    @Resource
    private UserMapper userMapper;

    void testJoin() {
        List<UserDTO> list = userMapper.selectJoinList(new MyLambdaQueryWrapper<UserEntity>()
                        .selectAll(UserEntity.class)
                        .leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
                                right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel))
                , UserDTO.class);
    }
}

对应sql

SELECT 
    t0.name,
    t0.sex, 
    t0.head_img, 
    t0.id, 
    t1.address, 
    t1.tel
FROM 
user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id

as(UserEntity::getHeadImg,UserDTO::getUserHeadImg)

查询字段head_img as userHeadImg

class test {
    @Resource
    private UserMapper userMapper;

    void testJoin() {
        List<UserDTO> list = userMapper.selectJoinList(new MyLambdaQueryWrapper<UserEntity>()
                        .as(UserEntity::getHeadImg, UserDTO::getUserHeadImg)
                        .leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
                                right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel))
                , UserDTO.class);
    }
}

对应sql

SELECT 
    t0.head_img AS userHeadImg, 
    t1.address,
    t1.tel
FROM 
user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id

左连接 leftJoin(UserEntity::getId,UserAddressEntity::getUserId,right -> right)

前连个参数是两个表的连接条件:
user left join user_address on user.id = User_address.user_id
第三个参数是右表wrapper对象,可以继续使用,以上方法.

条件查询eq()

class test {
    @Resource
    private UserMapper userMapper;

    void testJoin() {
        List<UserDTO> list = userMapper.selectJoinList(new MyLambdaQueryWrapper<UserEntity>()
                        .selectAll(UserEntity.class)
                        .leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
                                right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel))
                        .eq(true, UserEntity::getId, 1)
                        .like(UserAddressEntity::getTel, "1")
                        .eq(UserEntity::getId, UserAddressEntity::getUserId)
                , UserDTO.class);
    }
}

对应sql

SELECT 
    t0.name,
    t0.sex, 
    t0.head_img,
    t0.id, 
    t1.address,
    t1.tel
FROM 
user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id
WHERE (
    t0.id = ? 
    AND t1.tel LIKE ? 
    AND t0.id = t1.user_id)

参考测试类

Description
No description provided
Readme Apache-2.0 4.3 MiB
Languages
Java 94.7%
Kotlin 5.3%