当前位置:首页 » 《随便一记》 » 正文

springboot 联表查询

20 人参与  2023年04月03日 16:27  分类 : 《随便一记》  评论

点击全文阅读


springboot 联表查询

业务分析:

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

数据库

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

organization表字段有:org_id、org_name

entity包下的User类

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

entity包下的Organization类

@Datapublic class Organization{    private Integer orgId;    private String orgName;    }

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

user_id、user_name、user_age、user_org_name

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

创建 vo 包下 UserVo类

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

两种办法

推荐第一种,因为数据库每次连接开销较大,第二种与数据库进行了多次连接,而第一种与数据库只需交互一次,效率较高。
第一种:直接sql做join连接,在数据库层面联表查询。
集成mybatis,编写userMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.xxx.mapper.UserMapper"> <resultMap id="organizationResult" type="organization">        <id     property="orgId"    column="org_id"     />        <result property="orgName"  column="org_name"   /></resultMap>    <resultMap type="UserVo" id="UserVoList">        <id     property="userId"       column="user_id"      />        <result property="userName"     column="user_name"    />        <result property="userAge"     column="user_age"    />        <association property="organization"  javaType="organization" resultMap="organizationResult" />    </resultMap><select id="selectUserVoList" resultMap="UserVoList">SELECT u.user_id,         u.user_name,         u.user_age,         o.org_id,         o.org_nameFROM user uLEFT JOIN organization oWHERE u.user_org_id = o.org_id</select>

``

public List<UserVo> selectUserVoList();

上述代码是伪代码,如果错误,欢迎指正,大致思想是这样的。


第二种:数据库层面单表查询 (循环查表,效率太低,不推荐)

这种办法没有在本博客中删除是因为想警示自己。这是本人初学时自己摸索的办法,那会刚入门,没有领路人走了许多弯路,能写出方法二的烂套路就能窥见一二,当时曾记得写出这洋洋洒洒的文章自己还怡然自得。时隔几年才改正确是不该,因此添加了方法一,之前写的这方法二现在看看确实是屎山,或许在过几年回过头看方法一又是另外的风景。
在此感谢评论区的指正,以后定当不断回顾,保持一颗学徒的心态继续积累。

创建 vo 包下 UserVo类

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

在 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信息

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {    @Resource    private UserMapper userMapper;      @Override    public 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()方法进行条件查询

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {    @Resource    private UserMapper userMapper;    @Resource    private OrganizationMapper organizationMapper;    @Override    public 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与传入的用户所属组织ID          Organization org = this.organizationMapper.selectOne(queryWrapper); //将条件传入就能拿到一个组织信息          org.getOrgName()//通过get就能拿到这个组织信息中的名称信息        }      }//此时我们有了user信息,以及user对应的组织名称信息,接下来我们只需要封装就可以

封装UserVo

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {    @Resource    private UserMapper userMapper;    @Resource    private OrganizationMapper organizationMapper;    @Override    public 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

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {    @Resource    private UserMapper userMapper;    @Resource    private OrganizationMapper organizationMapper;    @Override    public 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 {    @Resource    private UserService userService;//注入userService        @GetMapping("/list")    public List<UserVo> voList(){        return this.userService.voList();    }}

点击全文阅读


本文链接:http://zhangshiyu.com/post/58230.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1