1 關聯查詢
1.1 用戶訂單案例
- user和orders:
User 與orders:一個用戶可以創建多個訂單,一對多
Orders 與 user:多個訂單隻由一個用戶創建,多對一 - orders和orderdetail:
Orders 與 orderdetail:一個訂單可以包括 多個訂單明細,因爲一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關係
orderdetail 與orders:多個訂單明細包括在一個訂單中, 多對一 - orderdetail和items:
Orderdetail 與 items:多個訂單明細只對應一個商品信息,多對一
Items 與 orderdetail:一個商品可以包括在多個訂單明細 ,一對多
- 查找某個訂單 id 的信息
1.2 一對一
1.2.1 resultType實現
複雜查詢時,單表對應的po類已不能滿足輸出結果集的映射。所以要根據需求建立一個擴展類來作爲resultType的類型。
# 一對一
SELECT o.*, u.username,u.address FROM orders o,user u
WHERE o.user_id = u.id AND o.id=3;
- 訂單擴展類
-
訂單類
-
訂單擴展類
package com.tzb.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.tzb.mapper;
import com.tzb.model.OrdersExt;
public interface OrderMapper {
public OrdersExt findOrderById(int id);
}
- 訂單配置
- mybatis配置文件
- 測試
public class Demo5 {
private SqlSession session;
@Before
public void before() throws IOException {
System.out.println("before.......獲取 session");
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
session = factory.openSession();
}
@After
public void after() {
System.out.println("after.......關閉 session");
session.close();
}
@Test
public void test1() throws IOException {
// 代理
OrderMapper mapper = session.getMapper(OrderMapper.class);
OrdersExt ordersExt = mapper.findOrderById(3);
System.out.println(ordersExt);
}
}
1.2.2 一對一 resultMap實現
- 模型裏有模型
- OrderMapper.xml
<!--模型裏有模型,使用 resultMap-->
<resultMap id="orderRslMap" type="orders">
<!--order模型匹配數據-->
<id column="id" property="id"></id>
<id column="note" property="note"></id>
<id column="number" property="number"></id>
<id column="createtime" property="createtime"></id>
<!--order 的 user 匹配數據-->
<association property="user" javaType="user">
<id column="user_id" property="id"></id>
<id column="username" property="username"></id>
<id column="address" property="address"></id>
</association>
</resultMap>
<select id="findOrderById2" parameterType="int" resultMap="orderRslMap">
SELECT
o.*, u.username,u.address
FROM
orders o,user u
WHERE
o.user_id = u.id
AND o.id = #{id};
</select>
- 測試
@Test
public void test1() throws IOException {
// 代理
OrderMapper mapper = session.getMapper(OrderMapper.class);
Orders orders = mapper.findOrderById2(3);
System.out.println(orders);
System.out.println(orders.getUser());
}
1.3 一對多
根據定單ID查找定單信息、用戶信息和定單明細信息
- 訂單詳情模型 OrderDetail.java
- OrderMapper.xml
<!--一對多-->
<resultMap id="orderRslMap3" type="orders">
<!--order模型匹配數據-->
<id column="id" property="id"></id>
<id column="note" property="note"></id>
<id column="number" property="number"></id>
<id column="createtime" property="createtime"></id>
<!--order 的 user 匹配數據-->
<association property="user" javaType="user">
<id column="user_id" property="id"></id>
<id column="username" property="username"></id>
<id column="address" property="address"></id>
</association>
<!--往 orders 的orderdetails匹配數據-->
<collection property="orderDetails" ofType="orderDetail">
<id column="detail_id" property="id"></id>
<id column="items_id" property="itemsId"></id>
<id column="items_num" property="itemsNum"></id>
</collection>
</resultMap>
<select id="findOrderById3" parameterType="int" resultMap="orderRslMap3">
SELECT
o.*,
u.username,
u.address,
od.id detail_id,
od.items_id,
od.items_num
FROM
orders o,
user u,
orderdetail od
WHERE
o.user_id = u.id
AND o.id = od.orders_id
AND o.id = #{id};
</select>
- 測試
@Test
public void test1() throws IOException {
// 代理
OrderMapper mapper = session.getMapper(OrderMapper.class);
Orders orders = mapper.findOrderById3(3);
System.out.println(orders);
System.out.println(orders.getUser());
System.out.println(orders.getOrderDetails());
}
1.4 多對多
查詢用戶信息及用戶購買的商品信息,要求將關聯信息映射到主pojo的pojo屬性中
SELECT
u.id,
u.username,
u.address,
o.id order_id,
o.number,
o.createtime,
o.note,
od.id detail_id,
od.items_id,
od.items_num,
it.name,
it.price,
it.detail
FROM
user u,
orders o,
orderdetail od,
items it
WHERE
o.user_id = u.id
AND o.id = od.orders_id
AND od.items_id = it.id;
- UserMapper.xml
<resultMap id="userRsMap" type="user">
<!--user屬性匹配-->
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<!--匹配 user 的 orderList-->
<!--一對多,collection-->
<collection property="orderList" ofType="orders">
<id column="order_id" property="id"></id>
<result column="number" property="number"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
<!--匹配 Orders 裏有 orderDetails -->
<collection property="orderDetails" ofType="orderDetail">
<id column="detail_id" property="id"></id>
<result column="items_id" property="itemsId"></result>
<result column="items_num" property="itemsNum"></result>
<!--配置訂單詳情的商品信息-->
<association property="items" javaType="items">
<id column="items_id" property="id"></id>
<result column="name" property="name"></result>
<result column="price" property="price"></result>
<result column="detail" property="detail"></result>
</association>
</collection>
</collection>
</resultMap>
<select id="findUserAndOrderInfo" resultMap="userRsMap">
SELECT
u.id,
u.username,
u.address,
o.id order_id,
o.number,
o.createtime,
o.note,
od.id detail_id,
od.items_id,
od.items_num,
it.name,
it.price,
it.detail
FROM
user u,
orders o,
orderdetail od,
items it
WHERE
o.user_id = u.id
AND o.id = od.orders_id
AND od.items_id = it.id;
</select>
- 測試類
@Test
public void test1() throws IOException {
// 代理
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.findUserAndOrderInfo();
for (User user : users) {
System.out.println("用戶信息:" + user);
for (Orders order : user.getOrderList()) {
System.out.println("訂單信息:" + order);
System.out.println("訂單詳情:");
for (OrderDetail orderDetail : order.getOrderDetails()) {
System.out.println(orderDetail + ":" +orderDetail.getItems());
}
System.out.println("------------------------");
}
}
}