Учебные заметки MyBatis (2) — сопоставление отношений
Учебные заметки MyBatis (3) - взаимно однозначное сопоставление расширенного сопоставления
Учебные заметки Mybatis (4) - сопоставление «один ко многим» расширенного сопоставления
Учебные заметки Mybatis (5) — сопоставление «многие ко многим» расширенного сопоставления
Предположим, что сейчас у нас есть такой спрос, и мы хотим знать, какие продукты приобрел определенный клиент, но, наблюдая за таблицей клиентов и таблицей продуктов, мы обнаруживаем, что эти две таблицы не связаны, так что же нам делать? В предыдущем примере мы можем обнаружить, что через две таблицы заказов и заказов, таблицы клиентов и таблицы продуктов можно установить косвенную связь.
Мы используем таблицу клиентов в качестве основной таблицы, тогда оператор запроса должен быть
SELECT c.*, o.*, oi.*, p.*
FROM customers AS c, orders AS o, orderitems AS oi, products AS p
WHERE c.cust_id=o.cust_id
AND o.order_num=oi.order_num
AND oi.prod_id=p.prod_id
В соответствии с интерпретацией предыдущего раздела. Если мы используем ResultType для определения типа возвращаемого значения, определенный класс POJO будет содержать множество похожих частей, поэтому лучше всего использовать ResultMap для определения возвращаемого типа, чтобы мы могли быть в исходном Класс клиента Атрибут расширения для хранения заказа, тогда элемент заказа будет содержать элемент заказа, а элемент заказа будет связан с конкретной товарной ассоциацией, связь ассоциации легко понять.
Так что давайте посмотрим, как нами определяется класс.
определение POJO
public class Customer {
private Integer custId;
private String custName;
private String custAddress;
private String custCity;
private String custState;
private String custZip;
private String custCountry;
private String custContact;
private String custEmail;
//新增的orderList用于存储该客户所下的订单
List<Orders> ordersList;
В классе Orders мы удаляем исходное свойство Customer, и больше ничего не перемещается.
Orders содержит свойство OrderItems, а OrderItems определяется следующим образом:
public class OrderItems {
private Integer orderNum;
private Integer orderItem;
private String prodId;
private Integer quantity;
private Double itemPrice;
//新增的商品类,那么就可以看到订单项中包含的商品的具体信息
private Products products;
Определить карту результатов
<resultMap id="CustomerAndProductsMap" type="com.shuqing28.pojo.Customer">
<id column="cust_id" property="custId"/>
<result column="cust_name" property="custName"/>
<result column="cust_address" property="custAddress"/>
<result column="cust_city" property="custCity"/>
<result column="cust_state" property="custState"/>
<result column="cust_zip" property="custZip"/>
<result column="cust_country" property="custCountry"/>
<result column="cust_contact" property="custContact"/>
<result column="cust_email" property="custEmail"/>
<collection property="ordersList" ofType="com.shuqing28.pojo.Orders">
<id column="order_num" property="orderNum"/>
<result column="order_date" property="orderDate"/>
<result column="cust_id" property="custId"/>
<collection property="orderItems" ofType="com.shuqing28.pojo.OrderItems">
<id column="order_num" property="orderNum"/>
<id column="order_item" property="orderItem"/>
<result column="prod_id" property="prodId"/>
<result column="quantity" property="quantity"/>
<result column="item_price" property="itemPrice"/>
<association property="products" javaType="com.shuqing28.pojo.Products">
<id column="prod_id" property="prodId"/>
<result column="vend_id" property="vendId"/>
<result column="prod_name" property="prodName"/>
<result column="prod_price" property="prodPrice"/>
<result column="prod_desc" property="prodDesc"/>
</association>
</collection>
</collection>
</resultMap>
Мы можем увидеть вложенную связь между Customer и Products из определения resultMap. Давайте продолжим рассмотрение определения оператора запроса:
<select id="findCustomerProducts" resultMap="CustomerAndProductsMap">
SELECT c.*, o.*, oi.*, p.*
FROM customers AS c, orders AS o, orderitems AS oi, products AS p
WHERE c.cust_id=o.cust_id
AND o.order_num=oi.order_num
AND oi.prod_id=p.prod_id
</select>
Через серию внутренних соединений запрашиваются продукты, связанные с клиентом.
Определите интерфейс:
public List<Customer> findCustomerProducts();
Тестовый код:
@Test
public void findCustomersProductsMap(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
List<Customer> customerProducts = ordersDao.findCustomerProducts();
System.out.println(customerProducts);
} finally {
sqlSession.close();
}
}
результат поиска
Как видно из рисунка, под свойством orderList клиента есть 2 заказа, каждый заказ будет содержать один или несколько элементов заказа orderItems, и каждый заказItem будет соответствовать продукту.Это так называемый запрос «многие ко многим» с большим количеством вложенных отношений.