MyBatis_Plus联表分页查询

MyBatis_Plus联表分页查询

当我们需要关联表格分页查询时,MyBatis_plus封装的单表方法已经满足不了我们的需求了,那么我们需要进行联表分页查询

假设我们需要的 SQL 语句如下:

        SELECT
        su.id,
        su.username,
        su.sex,
        su.user_identity,
        su.user_company,
        su.status,
        su.third_type,
        su.telephone,
        su.avatar,
        su.email,
        su.realname,
        su.post,
        su.del_flag,
        su.create_time,
        sr.role_name
        FROM
        sys_user AS su
        LEFT JOIN sys_user_role AS sur ON su.id = sur.user_id
        LEFT JOIN sys_role AS sr ON sur.role_id = sr.id
        order by su.create_time desc

那么我们需要进行如下操作:

  • 1、新建 UserInfoVO.java

UserInfoVo实际上是一个页面数据对象,由于页面上需要显示用户表的数据还需要根据用户去查询另一张表中的角色名称,所以UserInfoVO类似构造了一个MyBatis中的result,在MP中我们可以使用IPage<xxxEntity/DTO/Vo>来返回自定义多表联合查询列表数据并分页的展示需求。

import lombok.Data;

@Data
public class UserInfoVO extends UserInfo {
 /**
     * id
     */
    @TableId(type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 登录账号
     */
    @Excel(name = "登录账号", width = 15)
    private String username;

    /**
     * 真实姓名
     */
    @Excel(name = "真实姓名", width = 15)
    private String realname;

    /**
     * 密码
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    /**
     * md5密码盐
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String salt;

    /**
     * 头像
     */
    @Excel(name = "头像", width = 15, type = 2)
    private String avatar;


    /**
     * 性别(1:男 2:女)
     */
    @Excel(name = "性别", width = 15, dicCode = "sex")
    @Dict(dicCode = "sex")
    /**
     * 电子邮件
     */
    @Excel(name = "电子邮件", width = 15)
    private String email;

    /**
     * 电话
     */
    @Excel(name = "电话", width = 15)
    private String phone;
    
    /**
     * 删除状态(0,正常,1已删除)
     */
    @TableLogic
    @Excel(name = "删除状态", width = 15, dicCode = "del_flag")
    private Integer delFlag;
    
    //其他表的数据
    @TableField(exist = false)
    private String roleName;

}
123456789
  • 2、UserInfoMapper.java 中

Constants.WRAPPER:在MP官网的解释是:根据entity条件查询记录,所以

IPage<UserInfoVO> getUserList(@Param("username") String username, @Param("realname") String realname, @Param("status") Integer status, @Param("page") Page<UserInfoVO> page, @Param(Constants.WRAPPER) Wrapper<UserInfoVO> wrapper);
}
  • 3、UserInfoMapper.xml 中

${ew.customSqlSegment}:表示将自定义的SQL代码包裹,使用QueryWrapper(LambdaQueryWrapper)进行输出。

    <select id="getUserList" resultType="org.jeecg.modules.system.entity.SysUser">
        SELECT
        su.id,
        su.username,
        su.sex,
        su.user_company,
        su.status,
        su.telephone,
        su.avatar,
        su.email,
        su.realname,s
        su.del_flag,
        su.create_time,
        sr.role_name
        FROM
        sys_user AS su
        LEFT JOIN sys_user_role AS sur ON su.id = sur.user_id
        LEFT JOIN sys_role AS sr ON sur.role_id = sr.id
        <where>
            su.open_id is null and del_flag = 0
            <if test="username !=null and username!=''">
                and su.username like concat('%',#{username},'%')
            </if>
            <if test="realname !=null and realname!=''">
                and su.realname like concat('%',#{realname},'%')
            </if>
            
            <if test="status != null and status!=''">
                and su.status like concat('%',#{status}'%')
            </if>
        </where>
        order by su.create_time desc
        ${ew.customSqlSegment}
    </select>
  • 4、UserInfoServiceImpl.java 中
    @Override
    public IPage<UserInfoVO> getUserList(String username, String realname, Integer status, Page<UserInfoVO> page, QueryWrapper<UserInfoVO> queryWrapper) {
        return userMapper.getUserList(username, realname, status, page, queryWrapper);
    }

由此可见,serviceImpl返回的是一个IPage<XXXEntity/Dto/Vo>对象,IPage是一个分页对象,在Controller中可以在IPage中传入Page分页数据。

  • 5、UserController.java中
QueryWrapper<UserInfoVO> queryWrapper = new QueryWrapper<>();
        Page<UserInfoVO> page = new Page<UserInfoVO>(pageNo, pageSize);
        IPage<UserInfoVO> userPageList = sysUserService.getUserList(sysUser.getUsername(), sysUser.getRealname(), sysUser.getStatus(), page, queryWrapper);
        return Result.OK(userPageList);

以上就是分页查询(联表)时的操作,使用拼写SQL的方式实现多表联合分页查询,是效率最高的一种。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MyBatis-Plus是一个增强版的MyBatis框架,它提供了更方便的数据库操作功能。在进行联表分页查询时,可以使用MyBatis-Plus提供的LambdaQueryWrapper和Page类来实现。 首先,确保已经准备好数据库结构以及数据,并添加了MyBatis-Plus的依赖。 然后,在配置类中启用MyBatis-Plus的join功能,可以通过在DataScopeSqlInjector类中添加@Mapper注解来实现。 接下来,在实体类中定义需要查询的字段,并生成对应的Mapper接口。 在Service类中,可以使用LambdaQueryWrapper构建查询条件,并调用mapper的selectPage方法进行分页查询。使用Page对象指定分页参数,包括当前页码和每页显示的记录数。 最后,在测试类中调用Service的方法进行查询,并打印结果。 以下是示例代码: ```java // 实体类 @Data public class User { private Long id; private String name; private Integer age; private String email; } // Mapper接口 public interface UserMapper extends BaseMapper<User> { } // Service类 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public IPage<User> getUserListWithPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getAge, 20); return baseMapper.selectPage(page, queryWrapper); } } // 测试类 @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceImplTest { @Autowired private UserService userService; @Test public void testGetUserListWithPage() { int pageNum = 1; int pageSize = 10; IPage<User> userPage = userService.getUserListWithPage(pageNum, pageSize); List<User> userList = userPage.getRecords(); for (User user : userList) { System.out.println(user); } } } ``` 以上是使用MyBatis-Plus进行联表分页查询的方法。如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值