关联查询
- 一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段
- 一对多 是通过在“多”的一方,添加“一”的一方的主键作为外键
- 多对多 是通过一张中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键
-
user和orders:
User 与orders:一个用户可以创建多个订单,一对多 -
orders和orderdetail:
Orders 与 orderdetail:一个订单可以包括 多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系 -
orderdetail和items:
Orderdetail 与 items:多个订单明细只对应一个商品信息,多对一
一对一
需求:
根据商品ID查找定单信息,包括用户名和地址
一个订单对应一个用户
方法一:扩展类实现
-
在复杂查询时,单表对应的po类已经不能满足结果集的映射,所以根据需求建立一个扩展类作为resultType的类型
package com.hf.model; public class OrdersExt extends Orders { private String username; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "OrdersExt{" + "username='" + username + '\'' + ", address='" + address + '\'' + '}'+super.toString(); } }
-
声明订单接口
package com.hf.mapper; import com.hf.model.Orders; import com.hf.model.OrdersExt; public interface OrderMapper { /** * 通过id查找 * @param id * @return */ public OrdersExt findOrderById(int id); }
-
在OrderMapper.xml中配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.hf.mapper.OrderMapper"> <select id="findOrderById" resultType="ordersExt" parameterType="int"> SELECT o.*,u.username,u.address FROM orders o ,user u WHERE u.id = o.user_id AND o.id = #{id} </select> </mapper>
-
在全局配置文件中加载配置文件
<mapper resource="com/hf/mapper/OrderMapper.xml"></mapper>
-
测试
@Test public void test1() { OrderMapper mapper = session.getMapper(OrderMapper.class); OrdersExt ordersExt = mapper.findOrderById(3); System.out.println(ordersExt); }
方法二:在Orders类中实现一个User属性
-
在Orders类中添加一个User属性,并提供get/set方法
-
在OrderMapper.java中声明接口方法
/** * 通过id查找 * @param id * @return */ public Orders findOrderById2(int id);
-
在OrderMapper.xml中配置,使用resultMap
<!--如果模型里面有模型,使用resultMap--> <resultMap id="orderResultMap" type="or