Учебные заметки 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.