springboot 联表查询

业务分析:

在开发管理系统时,遇到需要将 User 和 对应的 Organization 联表查询起来,找到用户所对应的组织信息

数据库

user表中字段有:user_id、user_name、user_age、user_org_id

organization表字段有:org_id、org_name

entity包下的User类

@Data
public class User{private Integer userId;private String     userName;private Integer userAge;private Integer userOrgId;}

entity包下的Organization类

@Data
public class Organization{private Integer orgId;private String orgName;
}

已有的user对象并不满足查询需求,我们需要得到这样一个包装的对象以便查询下列信息:

user_id、user_name、user_age、user_org_name

故,此业务场景下可以引入vo

创建 vo 包下 UserVo类

@Data
public class UserVo{private Integer userId;private String   userName;private Integer userAge;private String     userOrgName;   //注意这里的数据类型和名称}

在 service 包下的 UserService 接口定义查询方法

public interface UserService extends IService<User> {public List<UserVo> voList();     //定义一个返回我们需要得到的包装对象方法 返回的是UserVo泛型的List集合
}

在 service\impl 包下的 UserServiceImpl 重写方法 编写业务逻辑

首先要明白:我们需要的 UserVo类中信息有两部分,一部分是来自于User类,另外一部分是来自于根据User类的organizationId查询到的对应的Organization的name信息。

因此我们需要首先将UserMapper注入,通过UserMapper类中的 selectList 方法(传入条件为空)查询出所有的User信息

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic List<UserVo> voList() {List<User> userList = this.userMapper.selectList(null);   //封装的是一个User泛型的List集合
}

此时userList集合中有了所有的user信息(user_id,user_name,user_age,user_org_id),接下来我们对 userList 进行遍历,拿出user_org_id查询所有对应的组织名称 ==这一步操作=> userList.getUserOrgId(),这里就需要注入 OrganizationMapper ,通过this.organizationMapper.selectOne()方法进行条件查询

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate OrganizationMapper organizationMapper;@Overridepublic List<UserVo> voList() {List<User> userList = this.userMapper.selectList(null);   //封装的是一个User泛型的List集合for (User user : userList) {       //重命名了userList集合QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();  queryWrapper.eq("org_id",user.getUserOrgId());      //比较数据库中org_id与传入的用户所属组织IDOrganization org = this.organizationMapper.selectOne(queryWrapper); //将条件传入就能拿到一个组织信息org.getOrgName()        //通过get就能拿到这个组织信息中的名称信息}}       //此时我们有了user信息,以及user对应的组织名称信息,接下来我们只需要封装就可以

封装UserVo

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate OrganizationMapper organizationMapper;@Overridepublic List<UserVo> voList() {List<User> userList = this.userMapper.selectList(null);UserVo userVo = null;             //定义一个userVo对象for (User user : userList) {userVo = new UserVo();           //每次循环创建一个新的vo对象。下面就是给这个vo对象存值BeanUtils.copyProperties(user,userVo);    //复制属性QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();queryWrapper.eq("org_id",user.getUserOrgId())Organization org = this.organizationMapper.selectOne(queryWrapper);userVo.setOrgName(org.getOrgName());  //将组织名称信息赋值给userVo中的OrgName}}
}

注意这里每次封装的是一条UserVo信息,因此我们还需要创建一个数组,存储每次封装好的UserVo

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate OrganizationMapper organizationMapper;@Overridepublic List<UserVo> voList() {List<User> userList = this.userMapper.selectList(null);UserVo userVo = null; List<UserVo> result = new ArrayList<>();       //最终需要返回的结果集合for (User user : userList) {userVo = new UserVo();            BeanUtils.copyProperties(user,userVo);      QueryWrapper<Organization> queryWrapper = new QueryWrapper<>();queryWrapper.eq("org_id",user.getUserOrgId())Organization org = this.organizationMapper.selectOne(queryWrapper);userVo.setOrgName(org.getOrgName()); result.add(userVo);     //每次userVo封装好,就把它加到result集合中}return result;      //将结果集返回}
}

controller层调用

@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;     //注入userService@GetMapping("/list")public List<UserVo> voList(){return this.userService.voList();}}

springboot 联表查询相关推荐

  1. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  2. 为什么强烈建议你不要做联表查询?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 前言 一直想要聊一聊关于开发 ...

  3. MyBatis-Plus联表查询

    MyBatis-Plus联表查询 mybatis-plus-join工具类似mybatis-plus中QueryWrapper的方式来进行联表查询 引入依赖 <dependency>< ...

  4. Spring Hibernate JPA 联表查询 复杂查询

    (转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...

  5. (转)MySQL联表查询

    资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别 在SQL标准中规划的(Join)联结大致分为下面四种: 1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. ...

  6. MYSQL 联表查询 ORDER 效率低?

    今天在处理一个分页时候,发现速度感人,点下一页等了半天.然后查看代码,发现是一个left jion语句. SELECT DISTINCT ordr.id,ordr.*,cf.nickname FROM ...

  7. 【explain】MySQL联表查询中的驱动表

    写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...

  8. mysql带账号联查表_MySQL联表查询的简单示例

    MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型 ...

  9. mysql的联表查询和去重复数据

    mysql的联表查询和去重复数据 /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.7.17-log : Database - pusmtnew ********** ...

最新文章

  1. AttributeError: ‘dict‘ object has no attribute ‘append‘
  2. Mysql大数据中表分区的应用
  3. Two Paths CodeForces - 14D(暴力+树的直径)
  4. MySQL优化(四):count()
  5. 源码mysql5.7安装过程_mysql5.7 源码安装步骤
  6. hnu 暑期实训之选美比赛
  7. 数字公式识别的学习笔记
  8. 坐标计算机在线使用,caslo计算器计算坐标的方法
  9. 腾讯入局“低代码”赛道:无需敲码,快速生成一个完整系统!
  10. 超分辨率技术AI人工智能老照片修复自动人像脑补照片高清重建人脸模糊图片变清晰软件
  11. [Chatter] 架构设计是做甚么
  12. 【计算机网络】计算机网络总结
  13. 物业智能化管理西方行政学说
  14. 34 个今年11月最受欢迎的 JavaScript 库
  15. python发送邮件时报: Error: need RCPT command
  16. 计算机网络考试重点复习(本科)
  17. 基于层次分析法的轴间预瞄和轴距预瞄俯仰半车LQR控制仿真分析(重型汽车)
  18. 如何在elementUi动态表格table中翻译字典值。vue通用方案
  19. win7自带tftp服务器,Win7系统开启TFTP服务器的方法
  20. 暴力拉丁方阵(C语言 6阶)

热门文章

  1. c语言用函数过程计算器,C语言用函数调用来编程一个计算器 怎么不对啊
  2. 2021下半年浙江事业单位统考内容汇总
  3. Frp 内网穿透配置文件
  4. python入门教程(非常详细)
  5. 饼图加引导线_PPT里的饼图,如何显示引导线?
  6. Ubuntu下单网卡多IP地址的配置
  7. 微信小程序云开发入门到放弃(二)WXML与WXSS
  8. java cookie 跨域读取_跨域读写Cookie
  9. 【MQTT】阿里云实现MQTT物联网平台通信
  10. 基于ssm智能仓库进销存管理系统