SpringBoot+Mybatis关联查询多表数据拼接结果集

SpringBoot+Mybatis关联查询多表数据集

一、需求描述

sys_column_role的id跟sys_column_role_permission的column_role_id关联
需要查询结果集1的所有数据,并且也要关联出结果集2的item_text数据
结果集1

 SELECT [id]
      ,[role_name]
      ,[role_code]
      ,[description]   from dbo.sys_column_role

在这里插入图片描述
结果集2

SELECT t1.[id]
      ,[column_role_id]
      ,[column_id]
	  ,t2.[item_text]
	  ,t2.[item_value]
  FROM [dbo].[sys_column_role_permission] t1
  left join sys_dict_item t2 on t1.[column_id]=t2.id collate database_default

在这里插入图片描述

二、项目代码

SysUserPrivilegesController

@RestController
@RequestMapping("/sys/privileges")
@Slf4j
@Api(value = "用户权限分配", tags = {"用户权限分配"})
public class SysUserPrivilegesController {
    @Autowired
    ISysUserPrivilegesService sysUserPrivilegesService;
    //查询所有
    @RequestMapping(value = "/selectAll", method = RequestMethod.POST)
    @ApiOperation("查询所有字段角色表")
    @AutoLog(value = "查询所有字段角色表")
    public Result selectAll() {
        return sysUserPrivilegesService.selectAll();
    }
}

ISysUserPrivilegesService

public interface ISysUserPrivilegesService {
    //查询所有字段角色表
    List selectAllColumnRole();
    /*重构Controller方法如下*/
    Result selectAll();
}

SysUserPrivilegesServiceImpl

@Service
public class SysUserPrivilegesServiceImpl implements ISysUserPrivilegesService {
    @Resource
    private SysUserPrivilegesMapper sysUserPrivilegesMapper;
    @Autowired
    ISysUserPrivilegesService sysUserPrivilegesService;
    
    //查询所有字段角色表
    @Override
    public List selectAllColumnRole() {
        List<SysColumnRole> sysColumnRolesList = sysUserPrivilegesMapper.selectAllColumnRole();
        List<LinkedHashMap<String,Object>> sysColumnRolePermissionList = sysUserPrivilegesMapper.selectFieldsData();
        List list = new ArrayList();
        //将sys_column_role_permission和sys_dict_item关联查询的结果,拼接到sys_column_role结果中
        for (int i = 0; i < sysColumnRolesList.size(); i++) {
            SysColumnRole sysColumnRole = new SysColumnRole();
            sysColumnRole.setId(sysColumnRolesList.get(i).getId());
            sysColumnRole.setRoleName(sysColumnRolesList.get(i).getRoleName());
            sysColumnRole.setRoleCode(sysColumnRolesList.get(i).getRoleCode());
            sysColumnRole.setDescription(sysColumnRolesList.get(i).getDescription());
            String id=sysColumnRolesList.get(i).getId();
            List<LinkedHashMap<String, Object>> subPermissions = sysColumnRolePermissionList.stream().filter(v -> v.get("column_role_id").equals(id)).collect(Collectors.toList());
            String fieldsName="";
            String fieldsId="";
            for (int j = 0; j  < subPermissions.size(); j ++) {
                if(StringUtils.isBlank(fieldsId))
                {
                    fieldsId += subPermissions.get(j).get("column_id")==null?"":subPermissions.get(j).get("column_id").toString();
                    fieldsName += subPermissions.get(j).get("item_text")==null?"":subPermissions.get(j).get("item_text").toString();
                }
                else
                {
                    fieldsId += ","+(subPermissions.get(j).get("column_id")==null?"":subPermissions.get(j).get("column_id").toString());
                    fieldsName += ","+(subPermissions.get(j).get("item_text")==null?"":subPermissions.get(j).get("item_text").toString());
                }
            }
            sysColumnRole.setFieldsId(fieldsId);
            sysColumnRole.setFieldsName(fieldsName);
            list.add(sysColumnRole);
        }
        return list;
    }
}    

实体类SysColumnRole

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysColumnRole {
    //字段角色表
    private static final long serialVersionUID = 1L;
    /**
     * 创建人
     */
    private String createBy;
    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 描述
     */
    private String description;
    /**
     * 字典编码
     */
    private String roleCode;
    /**
     * 字典名称
     */
    private String roleName;
    /**
     * id
     */
    private String id;
    /**
     * 更新人
     */
    private String updateBy;

    /**
     * 更新时间
     */
    private Date updateTime;

    private String fieldsId;//数据库中此字段无

    private String fieldsName;//数据库中此字段无

    @Override
    public String toString() {
        return "SysColumnRole{" +
                "createBy='" + createBy + '\'' +
                ", createTime=" + createTime +
                ", description='" + description + '\'' +
                ", roleCode='" + roleCode + '\'' +
                ", roleName='" + roleName + '\'' +
                ", id='" + id + '\'' +
                ", updateBy='" + updateBy + '\'' +
                ", updateTime=" + updateTime +
                ", fieldsId='" + fieldsId + '\'' +
                ", fieldsName='" + fieldsName + '\'' +
                '}';
    }
}

实体类SysColumnRolePermission

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysColumnRolePermission {
    //字段角色子表
    private static final long serialVersionUID = 1L;
    /**
     * id
     */
    private String id;
    /**
     * column_role_id
     */
    private String columnRoleId;
    /**
     * column_id
     */
    private String columnId;

    @Override
    public String toString() {
        return "SysColumnRolePermission{" +
                "id='" + id + '\'' +
                ", columnRoleId='" + columnRoleId + '\'' +
                ", columnId='" + columnId + '\'' +
                '}';
    }
}

SysUserPrivilegesMapper

public interface SysUserPrivilegesMapper {
    /*@Param注解的作用,当我们的sql中需要多个参数的时候,Maybatis会将参数列表中的参数封装成一个Map进行传递,这个过程是通过@Param来实现的,
      @Param注解括号中的值会作为key,value就是参数实际的值。解析参数的时候会按照@Param中定义的key获取对应的值。
    */
    //修改字段角色表
    boolean updateColumnRoleById(@Param("id") String id, @Param("roleCode") String roleCode, @Param("roleName") String roleName,@Param("description") String description, @Param("updateBy") String updateBy);
    
    //查询所有字段角色表
    List<SysColumnRole> selectAllColumnRole();
    //查询fields属性名和值
    List<LinkedHashMap<String,Object>> selectFieldsData();
}

SysUserPrivilegesMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aac.modules.system.mapper.SysUserPrivilegesMapper">
    <!-- 查询所有字段角色表 -->
    <select id="selectAllColumnRole" resultType="com.modules.system.entity.SysColumnRole">
        SELECT id,role_name,role_code,description
        FROM dbo.sys_column_role
    </select>

    <!-- 查询fields属性名和值 -->
    <select id="selectFieldsData" resultType="java.util.LinkedHashMap">
        SELECT t1.id
             ,column_role_id
             ,column_id
             ,t2.item_text
             ,t2.item_value
        FROM dbo.sys_column_role_permission t1
        left join sys_dict_item t2 on t1.column_id=t2.id collate database_default
    </select>
</mapper>

三、测试

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用SpringbootMybatis-plus实现多表联查分页的情况下,你可以按照以下步骤进行操作: 1. 首先,你需要配置分页插件。在MybatisPlusConfig类,使用@Bean注解配置一个PaginationInterceptor的bean,并返回该对象。 2. 接下来,你可以在你的业务逻辑使用Mybatis-plus提供的API实现多表联查分页。使用Mybatis-plus的Wrapper类构建查询条件,然后调用Mybatis-plus的selectPage方法进行分页查询。 3. 你可以在Wrapper对象使用join方法来关联多张表,并使用eq、like等方法设置查询条件。 4. 在selectPage方法,传入一个Page对象作为参数,该Page对象包含了页码、每页显示数量等信息。调用selectPage方法后,会返回一个IPage对象,其包含了查询结果和分页信息。 举个例子,假设你要查询用户表和订单表,并分页显示结果,可以按照以下步骤进行操作: 1. 在你的业务逻辑,引入UserService和OrderService(假设已经定义了对应的service类)。 2. 创建一个Wrapper对象,并分别使用join方法关联用户表和订单表。 3. 使用eq、like等方法设置查询条件。 4. 创建一个Page对象,设置页码和每页显示数量。 5. 调用UserService的selectPage方法,传入Wrapper对象和Page对象作为参数。 6. 从返回的IPage对象获取查询结果和分页信息。 以上是使用SpringbootMybatis-plus实现多表联查分页的基本步骤。通过Mybatis-plus的API和分页插件,我们可以简化开发过程,减少手写sql语句的情况,实现多表联查分页。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java企业报表管理系统源码](https://download.csdn.net/download/m0_55416028/88269629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SpringBoot整合Mybatis-plus 实现自定义的多表查询、分页条件查询](https://blog.csdn.net/shilu6558445/article/details/123792323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [springboot + mybatis plus实现多表联查分页](https://blog.csdn.net/weixin_33913332/article/details/92172655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值