1. 一对一的关系
首先先看数据库
tb_user
tb_orders
执行这条sql:
也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id
也就是说, 从后面看, 就是每个订单id对应的用户信息, 从前面看就是每个订单id的订单信息
为什么说这里是一对一的关系呢?
因为, 订单是副表, 这里查询的是tb_orders, 每条订单只能有一个用户
以上是数据库中的多表联合查询, 那么在代码中应该怎么实现这个多表联合查询呢?
表的实体类
package com.itdong.domain;
import java.util.Date;
public class Orders {
private int id;
private Date ordertime;
private double total;
//不要这么写
//private int uid;
private User user; //表明这这个订单属于那个用户
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", ordertime=" + ordertime +
", total=" + total +
", user=" + user +
'}';
}
}
为什么这个的属性不是uid, 而是user呢, 因为实际上我们开发时光findAll订单表并没有意义, 而是要多表联合查找, 也就是查询订单表时要联合每一条订单的用户信息, 所以订单表的实体类这里属性不能只是uid, 要user, 因为user里就是用户所有信息
但是这样有出现一个问题, 就是说用我们之前学习的知识来配置时, findAll执行完是这样的, user全是null
为什么呢?
因为我们配置OrdersMapper.xml映射文件是时,
<select id="findAll" resultType="com.itdong.domain.Orders">
SELECT * , o.id oid FROM tb_orders o, tb_user u WHERE o.uid = u.id;
</select>
resultType等于的是"com.itdong.domain.Orders"
也就是说, 对于多表查询操作来说, 查询出来的结果往往有其他的表的对象, 例如本例的订单表联合用户表的查询, domain.Orders这个Bean实例中就有一个User属性, 但是mysql中只能查询出字段,并不能帮着将联合查询出来的User表的字段封装成一个对象存并作为属性放进订单表中。
这个时候就要使用框架来配置一个适合这次多表联合查询的结果集。
也就是配置一个resultMap.
除了以上的方法封装User对象
还有一种方法
2. 一对多的多表联合查询
订单表联合用户表是一对一,毕竟一个订单只能有一个用户,但是如果是反过来,使用用户联合订单表来查询,那么就是一对多的关系,一个用户可以有0和无穷多个订单
这里可以使用list做属性
2. 一对多的多表联合查询
案例:用户表和角色表的关系就是多对多的关系
一个用户可以用多个角色, 一个角色有多个用户
应用场景:查询用户的同时查询出该用户的所有角色
多表连接的sql语法
很明显, 这里的语句是使用的内连接,并且使用中间表来表达多对多的关系,只有在中间表中有数据的用户数据和角色数据会被查询出来。