Mybatis-多表联查
创始人
2024-03-13 18:56:40
0

多表联查

  • 一、步骤一:创建pojo实体类
  • 二、步骤二:明确两个实体类之间的关系
  • 三、步骤三:修改pojo实体类
  • 四、步骤四:编写Mapper接口
  • 五、步骤五:编写Mapper映射文件
      • 题目1:通过订单id查询订单详情以及所属用户
      • 题目2:通过用户id查询用户信息以及她所有的订单
  • 六、补充

在数据库查询中,很多时候不只是查询一张表,而是需要将多张表结合起来才能获得需要的数据,下面介绍在mybatis中怎么实现多表联查(前提是所有的依赖均已配置完成)

一、步骤一:创建pojo实体类

将需要用到的表全部创建成java的实体类,导入lombok依赖(自动生成get、set等方法)
User 用户表 Order 订单表

@Data
public class User {private Integer ID;private String username;private String PASSWORD;private String sex;private Date brithday;private String address;
}

二、步骤二:明确两个实体类之间的关系

一个用户可以有多条订单,而一条订单只属于一个用户
所以;:用户对订单是1对多的关系
 
在设计数据库时(黄色部分):在多的一方(tb_order)中添加一个外键,与tb_user的主键对应(图中为uid)
 
在设计java对象时(红色部分): 需要根据题目进行pojo类的编写(具体看步骤三)

在这里插入图片描述


三、步骤三:修改pojo实体类

先分析清楚题目 如:

①:根据id查询订单以及订单的所属用户信息
=> 返回的数据是tb_order表中的数据+tb_user表中的数据,需要修改的实体类是Order,因为是根据order的id查询的


//需要在Order的实体类中引入User对象
public class Order {private Integer id;private Integer userid;private Date createtime;private String state;//    多对一private User user = new User();
}

②:根据用户id查询她的各类订单
=>返回的数据是tb_user+tb_order表中的数据,但是不同与上面的是:由于订单有多条所以订单需要用集合来装,而查询出的数据是要根据用户的id查询所有需要修改User类

// 需要在User表中的实体类中引入数据类型为Order的集合
public class User implements Serializable {private Integer ID;private String username;private String PASSWORD;private String sex;private Date brithday;private String address;//    一对多private List orders = new ArrayList<>();
}

四、步骤四:编写Mapper接口

public interface UserMapper {
//    通过订单id查询订单详情以及所属用户Order selectOrderAndInfoById(@Param("oid") int id);
//    通过用户id查询该用户的所有订单User selectByUserIdForOrder(@Param("uid") int id);
//    根据id查询用户User selectUserByid(@Param("uid") int id);
}

五、步骤五:编写Mapper映射文件

需要指定该映射文件是步骤四的Mapper,在namespace中指定

重点来了:

题目1:通过订单id查询订单详情以及所属用户

需要知道的是我们关联的是两张表,如果直接用下面的sql语句则只能查出订单的信息而订单所属用户则为空,这是因为在执行过程中Order会自动映射到tb_order的内容,但是在Order表中定义的User对象则无法自动映射到tb_user表中的内容

SELECT  u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,o.id oid,o.userid,o.createtime,o.state
FROM tb_user u JOIN tb_order o
ON u.ID  = o.userid
WHERE u.id= #{uid}

所以我们得手动映射User类,需要使用到resultMap
总体代码如下:

 u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,o.id oid,o.userid,o.createtime,o.state

selectParent为手动映射的Order类的Map,selectChildren为手动映射的User类的Map,由于需要返回的订单类的数据所有type中填写Order类,children继承了parent那么children中也会有parent的映射,所有selectChildren的map中就有了Order+User的映射
在这里插入图片描述
这个时候再SELECT FROM tb_user u JOIN tb_order oON u.ID = o.useridWHERE u.id= #{uid}

与上面不同的是集合映射使用关键字collection ,并且返回类型不再使用type而是使用ofType来指定
前面题目一映射是使用的继承,现在题目二映射是直接在父映射中继续映射,并且没有使用方法


六、补充

id唯一标识符
type写返回的类的类名
对非主键的映射
对主键的映射
property关联属性名 也就是User类中定义的各属性
column关联属数据库的字段
javaType关联属性的数据类型 在集合属性时不要写,但是在题目一的情况下就需要使用
ofType关联属性的数据类型 在集合属性时写,但是在题目一的情况下就不要使用

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...