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

本文介绍了如何在SpringBoot项目中使用Mybatis进行多表关联查询,将查询结果集整合到一起。具体涉及sys_column_role和sys_column_role_permission两个表的关联,以及查询结果的字段拼接。在 SysUserPrivilegesServiceImpl 中实现了查询逻辑,通过Mapper接口完成SQL的执行,并在Controller中提供接口对外服务。

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
在 Spring Boot 项目中使用 MyBatis-Plus 及其扩展库(如 `mybatis-plus-join-boot-starter`)进行 JOIN 查询时,返回空数据是一个常见问题。造成这一问题的原因可能涉及个方面,包括但不限于查询逻辑配置错误、字段映射不正确、数据库配置不当等。 ### 查询返回空数据的常见原因及解决方法 1. **JOIN 查询逻辑未正确配置** 在使用 `mybatis-plus-join-boot-starter` 进行 JOIN 查询时,需要确保构建的查询条件正确。例如,使用 `QueryWrapper` 或 `LambdaQueryWrapper` 时,需明确指定关联字段及连接方式。若未正确设置关联条件,可能导致 SQL 语句未正确拼接,从而查询不到数据。 示例代码: ```java List<User> users = userMapper.selectJoinList(User.class, new QueryWrapper<User>().eq("u.status", 1) .join("JOIN orders o ON u.id = o.user_id")); ``` 请确保 SQL 语句中的别名与字段别名与实体类字段匹配,避免字段映射错误[^2]。 2. **字段映射不匹配** MyBatis-Plus 在进行 JOIN 查询时,会将查询结果映射到实体类中。若数据库返回的字段名与实体类字段名不一致,且未通过注解或 XML 配置进行字段映射,则可能导致部分字段为 `null`,进而影响整体数据判断。 解决方法是使用 `@TableId` 和 `@TableName` 注解,或通过 `resultMap` 显式指定字段映射关系。 3. **数据库字符配置问题** 如果数据库、或字段的字符设置不一致,也可能导致查询结果为空。例如,MySQL 默认字符为 `utf8mb4` 的情况下,如果的字符仍为 `utf8`,可能在某些特殊字符处理上出现问题,从而影响查询结果。 需检查数据库、及字段的字符设置,并确保统一为 `utf8mb4`,以支持更广泛的字符,包括情符号[^3]。 4. **SQL 语句执行问题** 有时虽然代码逻辑正确,但 SQL 语句在数据库中执行时可能由于权限限制、索引缺失或查询条件不匹配而返回空结果。建议启用 MyBatis 的 SQL 日志输出功能,查看实际执行的 SQL 语句,并在数据库客户端中手动执行该语句以验证其正确性。 5. **缓存机制干扰** 如果项目中启用了 MyBatis 的二级缓存或其他缓存机制,可能导致查询结果未及时更新。可通过清除缓存或禁用缓存功能进行排查。 ### 示例配置:启用 SQL 日志输出 ```yaml logging: level: com.baomidou.mybatisplus.core.mapper: debug ``` ### 示例配置:统一字符设置 ```sql ALTER DATABASE your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值