Учебные заметки Mybatis (3) - однозначное сопоставление расширенного картографирования

база данных MyBatis

Учебные заметки MyBatis (1) - используйте артикли

Учебные заметки MyBatis (2) — сопоставление отношений

Учебные заметки MyBatis (3) - взаимно однозначное сопоставление расширенного сопоставления

Учебные заметки Mybatis (4) - сопоставление «один ко многим» расширенного сопоставления

Учебные заметки Mybatis (5) — сопоставление «многие ко многим» расширенного сопоставления

...Следите за обновлениями

Предыдущий раздел, посвященный отношениям сопоставления, посвящен описанию сопоставления входных данных и сопоставления выходных данных, но мы обнаружили, что все запросы основаны на одной таблице, поэтому в этом разделе мы продолжаем говорить о многотабличных запросах, которые мы называем расширенным сопоставлением. , Расширенное сопоставление по-прежнему предназначено для выходного сопоставления, оно разделено на «один к одному», «один ко многим» и «многие ко многим». Тогда прежней структуры базы данных недостаточно, поэтому мы воссоздаем здесь модель данных о товарах заказа и используем эту модель для объяснения приведенных выше различных сопоставлений одно за другим.

Подготовка базы данных

В нашу базу данных включены следующие таблицы:

Таблица клиентов (клиенты)

CREATE TABLE customers
(
  cust_id      int       NOT NULL AUTO_INCREMENT,
  cust_name    char(50)  NOT NULL ,
  cust_address char(50)  NULL ,
  cust_city    char(50)  NULL ,
  cust_state   char(5)   NULL ,
  cust_zip     char(10)  NULL ,
  cust_country char(50)  NULL ,
  cust_contact char(50)  NULL ,
  cust_email   char(255) NULL ,
  PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

Заказы

CREATE TABLE orders
(
  order_num  int      NOT NULL AUTO_INCREMENT,
  order_date datetime NOT NULL ,
  cust_id    int      NOT NULL ,
  PRIMARY KEY (order_num)
) ENGINE=InnoDB;

Таблица заказов содержит cust_id, который может быть связан с таблицей клиентов, указывая на клиента, разместившего заказ.

Позиции (элементы заказа)

CREATE TABLE orderitems
(
  order_num  int          NOT NULL ,
  order_item int          NOT NULL ,
  prod_id    char(10)     NOT NULL ,
  quantity   int          NOT NULL ,
  item_price decimal(8,2) NOT NULL ,
  PRIMARY KEY (order_num, order_item)
) ENGINE=InnoDB;

Элемент строки содержит order_num, связанный с таблицей заказов, в которой записан заказ, к которому принадлежит элемент строки. prod_id указывает, к какому продукту относится позиция, и связан с таблицей продуктов ниже.

продукты

CREATE TABLE products
(
  prod_id    char(10)      NOT NULL,
  vend_id    int           NOT NULL ,
  prod_name  char(255)     NOT NULL ,
  prod_price decimal(8,2)  NOT NULL ,
  prod_desc  text          NULL ,
  PRIMARY KEY(prod_id)
) ENGINE=InnoDB;

vend_id связан с таблицей поставщиков ниже, указывая, какой поставщик произвел продукт.

поставщик

CREATE TABLE vendors
(
  vend_id      int      NOT NULL AUTO_INCREMENT,
  vend_name    char(50) NOT NULL ,
  vend_address char(50) NULL ,
  vend_city    char(50) NULL ,
  vend_state   char(5)  NULL ,
  vend_zip     char(10) NULL ,
  vend_country char(50) NULL ,
  PRIMARY KEY (vend_id)
) ENGINE=InnoDB;

С приведенными выше таблицами давайте рассмотрим несколько отношений отображения.

сопоставление один к одному

Предположим, нам нужно запросить всю информацию о заказе и запросить информацию о клиенте, создавшем заказ по ассоциации.Поскольку у заказа может быть только один клиент, это запрос один к одному. Основываясь на предыдущих знаниях, мы можем использовать resultType или resultMap для установки типа возвращаемого значения.

Отображение один к одному с использованием resultType

проверить фразу:

SELECT o.order_num,o.order_date, c.*
    FROM orders AS o, customers AS c
    WHERE o.cust_id = c.cust_id

Создайте POJO, поскольку результат нашего запроса содержит содержимое двух таблиц, мы сначала определяем Orders

public class Orders {
    private Integer orderNum;
    private Date orderDate;
    private Integer custId;
    //setter and getter
    ...
}

Наследуйте Orders, чтобы настроить класс OrdersCustomers для переноса результатов запроса.

public class OrdersCustomers extends Orders {
    private String custName;
    private String custAddress;
    private String custCity;
    private String custState;
    private String custZip;
    private String custCountry;
    private String custContact;
    private String custEmail;
    //setter and getter
    ...
}

Поскольку все свойства в POJO представляют собой имена в регистре верблюдов, а имена столбцов базы данных подчеркнуты, поэтому здесь мы устанавливаем это в файле конфигурации mybatis:

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true" />
</settings>

Таким образом, может быть реализовано автоматическое сопоставление базы данных с объектами POJO.

Определено в Mapper:

<select id="findOrdersCustomer" resultType="com.shuqing28.pojo.OrdersCustomers">
        SELECT o.order_num,o.order_date, c.*
        FROM orders AS o, customers AS c
        WHERE o.cust_id = c.cust_id
    </select>

Интерфейс определен в DAO:

List<OrdersCustomers> findOrdersCustomer();

Тестовый код:

@Test
public void getOrdersCustomers(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
        List<OrdersCustomers> orders = ordersDao.findOrdersCustomer();
        System.out.println(orders);
    } finally {
        sqlSession.close();
    }
}

результат поиска:

Отображение один к одному с использованием resultMap

Оператор SQL не изменится, мы сначала добавим свойство Customer в Orders:

private Customer customer;

Определить карту результата:

<resultMap id="OrdersCustomerResultMap" type="com.shuqing28.pojo.Orders">
    <id column="order_num" property="orderNum"/>
    <result column="order_date" property="orderDate"/>
    <result column="cust_id" property="custId"/>
    
    <association property="customer" javaType="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"/>
    </association>
</resultMap>

обратите внимание на использованиеassociationтег для настройки информации о клиенте, связанной с отображением. Идентификатор картыOrdersCustomerResultMap, можно использовать позже.

Определите оператор выбора:

 <select id="findOrdersCustomerMap" resultMap="OrdersCustomerResultMap">
    SELECT o.order_num,o.order_date, c.*
    FROM orders AS o, customers AS c
    WHERE o.cust_id = c.cust_id
</select>

Мы использовали карту результатов, определенную ранее.

определить интерфейс

public List<Orders> findOrdersCustomerMap();

тестовый код

@Test
public void getOrdersCustomersMap(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
        List<Orders> orders = ordersDao.findOrdersCustomerMap();
        System.out.println(orders);
    } finally {
        sqlSession.close();
    }
}

Результаты теста

Резюме: сопоставление один к одному с упором на тег ассоциации в resultMap.