English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Так называемый односторонний запрос означает, что при запросе данных из одной таблицы нам нужно также запросить данные из других таблиц.
Требование
Сначала давайте поговорим о малом требовании использования одностороннего запроса: предположим, что нам нужно запросить информацию о заказе и одновременно получить информацию о пользователе, создавшем этот заказ. Структура таблицы такая (
ResultType
Запись SQL-запроса
Сначала мы должны проанализировать наши потребности. 1. Нам нужно определить, какие таблицы включены в эту потребность, какая из них является основной таблицей, а какая связанной таблицей. Как это определить, зависит от потребности - наша потребность в том, чтобы при запросе заказа также получить пользователя, создающего этот заказ. Тогда уже очевидно. Нашей основной таблицей является таблица заказов (orders). А нашей связанной таблицей является таблица пользователей (user).
В этот момент мы можем написать следующий SQL-запрос:
select * from orders
В этот момент мы должны подумать о этой проблеме: должны ли мы использовать внутренний запрос или внешнюю ссылку при связанном запросе? Для тех, кто не понимает разницу между внутренним и внешним запросами, я сначала кратко介绍一下, а затем в будущем я напишу более подробную статью в блоге: внутренний запрос показывает только удовлетворяющие условия. Внешние ссылки делятся на левую и правую внешние ссылки: левая связь показывает все слева и добавляет те, которые такие же справа; правая связь показывает все справа и те, которые такие же слева.
Наша потребность в том, чтобы через заказы связать пользователей, а поскольку в таблице orders есть внешняя ссылка (userId). При поиске данных таблицы user через внешнюю ссылку userId является основным ключом таблицы user. В этот момент можно получить только одну информацию о user, и это не изменит наш результат основного запроса. Поэтому мы выбираем внутренний запрос. В этот момент наш запрос SQL такой:
select * from orders, user where orders.user_id = user.id
После завершения запроса出现了以下结果:
В этот момент возникла проблема, мы обнаружили, что出现了两个 id, это может привести к тому, что наши данные будут упакованы в объект при выводе, и это может вызвать проблемы. Кроме того, колонка User_id и наши данные пользователя id дублируются. Нам нужно изменить наш SQL. Как это сделать?
Поскольку наши данные в основной таблице должны быть полностью проинкрутированы, а данные пользователей нам нужны только username, sex, adress эти три информации (здесь это предположение, не нужно волноваться о том, какие данные нужны). Тогда нам нужно вручную определить поля запроса SQL:
SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id
Все это было проверено в нашем инструменте для подключения к SQL, когда мы можем увидеть нужную базу данных, наша SQL-запрос уже определен. В этот момент мы должны начать следующий шаг:
Создание pojo
Нам нужно封装 результаты запроса в соответствующие объекты через фреймворк mybatis. Так что вопрос arises, кто будет принимать эти данные? Если мы хотим отображать результаты sql запроса в pojo, pojo должен включать все имена колонок в запросе. Но ни в классе Orders, ни в классе User нет возможности отображать все поля. В этом случае у нас есть очень простое решение: создать класс, который включает все результаты запроса, и этот класс будет принимать результаты набора данных.
Здесь есть хитрость: в новом pojo нам не нужно записывать все поля, мы можем позволить новому pojo наследовать наш класс, содержащий множество полей в результаты запроса, и затем добавить другие необходимые данные в этот подкласс.
После создания pojo нам нужно создать файл карты mappings в соответствии с normами и написать методы в соответствующем интерфейсе:
mapper.xml
Интерфейс в mapper.java:
ResultMap
На уровне sql, способ реализации resultType и resultMap аналогичен, поэтому мы пропустим его.
Мысль о отображении resultMap
Мы знаем, что когда мы используем pojo, мы можем封装 данные в атрибуты объекта pojo, которые могут быть простыми типами или другим pojo. В этом случае мы можем сделать так:
Используя resultMap, мы отображаем информацию о заказе в объект Orders, добавляем атрибут User в класс orders, чтобы отображать информацию о пользователе, полученную из связанного запроса, в атрибут user объекта orders.
Добавление атрибута user в класс Orders
mapper.xml
Когда мы используем метод resultMap для отображения набора результатов, нам нужно выполнить две операции: определить resultMap, настроить атрибуты объектов, соответствующие каждой колонке в результаты запроса. Это может быть немного сложно, но не сложно. Во-вторых, определить наше statement.
resultMap
Мы уже рассказали о базовом подходе к реализации resultMap. Кроме того, в классе pojo orders мы добавили соответствующие атрибуты. Далее, нужно написать resultMap, чтобы отображать результаты запроса на класс Orders. Внутри этого resultMap в первую очередь отображается заказа. Это просто отображается с помощью id и тега result. Затем отображается информация о пользователе, для этого используется тег association, который отображает поле user класса orders на класс User. Внутри этого также используется id и тег result для отображения данных запроса и свойств User.
Конкретный код приведен ниже:
<!-- 订单查询关联用户的resultMap 将整个查询的结果映射到cn.mybatis.po.Orders中 --> <resultMap type="cn.mybatis.po.Orders" id="OrdersUserResultMap"> <!-- 配置映射的订单信息 --> <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id column:订单信息的唯 一标识 列 property:订单信息的唯 一标识 列所映射到Orders中哪个属性 --> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property=note/> <!-- 配置映射的关联的用户信息 --> <!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中哪个属性 --> <association property="user" javaType="cn.mybatis.po.User"> <!-- id:关联查询用户的唯 一标识 column:指定唯 一标识用户信息的列 javaType:映射到user的哪个属性 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap>
statement
statement довольно прост, просто измените способ привязки возвращаемого набора результатов на resultMap. Затем измените тип возвращаемого значения на только что созданный resultMap.
mapper.java
Различия между ними
После того как методы реализации一对一 поиска说完, давайте рассмотрим их различия и преимущества.
Во-первых, необходимо изменить pojo, добавить один pojo класс и изменить поля pojo. Лично я считаю, что в соответствии с принципом открытости и закрытости шаблонов проектирования resultType лучше, чем resultMap.
Во-вторых, с точки зрения простоты использования, resultType реализуется проще. С этой точки зрения, resultType также лучше, чем resultMap.
Однако resultMap可以实现 отложенную загрузку, что resultType не может. В этом отношении resultType не так хорош, как resultMap.
Таким образом, рекомендуется использовать resultType, если нет специальных требований к результатам поиска.
Как уже сказал редактор, я介绍了 функцию一对一 поиска mybatis, надеюсь, это поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, редактор ответит вам в ближайшее время. В этом также выражается признательность за поддержку сайта呐喊 руководства!
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @),并提供相关证据. Если факт будет подтвержден, сайт незамедлительно удалят涉嫌侵权的内容.