Например: поскольку информация о заказе может быть заказом, размещенным только одним человеком, начиная с информации о заказе запроса, связанная информация о пользователе запроса является запросом один к одному. Если исходить из информации о пользователе, запрос информации о заказе, размещенном пользователем, представляет собой запрос «один ко многим», поскольку один пользователь может размещать несколько заказов.
1.1 Индивидуальный запрос
необходимость
Запросить всю информацию о заказе и соответствующую информацию о пользователе заказа.
Оператор SQL
Основная информация: Форма заказа
Информация от: Пользовательская таблица
SELECT orders.*, user.username, user.address FROM orders LEFT JOIN user ON orders.user_id = user.id
Способ 1: тип результата
Метод возврата resultType относительно прост и часто используется, поэтому я не буду его представлять.
Способ 2: карта результатов
Используйте resultMap для сопоставления результатов и определите специальный resultMap для взаимно однозначного сопоставления результатов запроса.
Создайте класс, который расширяет po
Создайте класс OrdersExt (Этот класс используется для инкапсуляции набора результатов.), добавьте атрибут пользователя, и атрибут пользователя используется для хранения информации о пользователе связанного запроса. Поскольку пользователь запроса, связанный с порядком, представляет собой отношение один к одному, здесь используется один объект пользователя для хранения информации о пользователе. связанного запроса.
В частности, при использовании resultMap для сопоставления результатов ассоциация используется для завершения сопоставления связанного запроса, а связанная информация запроса сопоставляется с объектом pojo.
1.2 Запрос «один ко многим»
необходимость
Запрос всей информации о пользователе и информации о заказе, связанной с пользователем.
Оператор SQL
Основная информация: информация о пользователе
Из информации: информация о заказе
SELECT u.*, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN orders o ON u.id = o.user_id
анализировать
При запросе ассоциаций «один ко многим» вы можете использовать resultMap только для сопоставления результатов:
1. При использовании запроса ассоциации «один ко многим» имеется несколько результатов SQL-запроса и один объект сопоставления.
2. Запись о том, как resultType завершает сопоставление результатов, сопоставляется с объектом.
3. Результатом отображения результатов в resultMap является [основная информация] в качестве основного объекта, [ведомая информация] отображается как коллекция или объект, а затем инкапсулируется в основной объект.
Изменить класс po
Добавьте свойство «Список заказов» в класс «Пользователь».
Тег коллекции: определяет сопоставление результатов ассоциаций «один ко многим».
property="orders": какое свойство объекта User сохраняется в наборе результатов связанного запроса.
ofType="orders": указывает тип объекта в результирующем наборе связанного запроса, то есть тип объекта в списке. Здесь можно использовать псевдоним или полное имя.
Интерфейс картографа
// resultMap入门 public List<User> findUserAndOrdersRstMap() throws Exception;
тестовый код
@Test public void testFindUserAndOrdersRstMap() { SqlSession session = sqlSessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> result = userMapper.findUserAndOrdersRstMap(); for (User user : result) { System.out.println(user); } session.close(); }
2. Ленивая загрузка
2.1 Что такое ленивая загрузка
Ленивая загрузка в MyBatis, также известная какленивая загрузка, что означает, что при выполнении связанного запроса запрос на выборку связанного объекта откладывается в соответствии с заданным правилом задержки. Ленивая загрузка может эффективно снизить нагрузку на базу данных.
Ленивая загрузка Mybatis, нужно пройтиассоциация и сбор в теге resultMapПодтеги могут быть успешно продемонстрированы.
Ленивая загрузка Mybatis, также известная как вложенный запрос, соответствуетВложенные результатыПонятие , может относиться к случаю ассоциации «один ко многим».
Уведомление:Ленивая загрузка MyBatis имеет только отложенную настройку для запроса связанного объекта.Для основного объекта загрузки это SQL, который непосредственно выполняет оператор запроса..
2.2 Классификация ленивой загрузки
MyBatis основан на операторе выбора запроса для связанного объекта.время исполнения, делятся на три типа:Прямая загрузка, навязчивая загрузка и глубокая ленивая загрузка
Загрузить напрямую:После выполнения оператора выбора для основного загруженного объекта немедленно выполните запрос выбора для связанного объекта.
навязчивая задержка: При выполнении запроса к основному объекту загрузки запрос к связанному объекту не будет выполняться. Но когда вы хотите получить доступ к свойству основного объекта загрузки (это свойство не является свойством связанного объекта), запрос выбора связанного объекта будет выполнен немедленно.
Глубокая задержка:Когда выполняется запрос к основному объекту загрузки, запрос к связанному объекту не выполняется. Также при доступе к сведениям об основном загруженном объекте не выполняются запросы на выбор связанных объектов. Запрос на выбор связанного объекта выполняется только тогда, когда фактически осуществляется доступ к сведениям о связанном объекте.
Ленивая стратегия загрузки должна быть установлена с помощью тегов в глобальном файле конфигурации Mybatis.
2.3 Подготовка корпуса
Запросить информацию о заказе и информацию о его заказе.
2.4 Прямая загрузка
При установке глобального параметра: lazyLoadingEnabled значение по умолчанию равно false.
Использование глубокой ленивой загрузки повышает производительность.
Если слишком много табличных данных для ленивой загрузки, в это время возникнет проблема N + 1. Информация о главном загружается один раз, а информация о подчиненном будет запрашиваться несколько раз в соответствии с условиями, переданными информацией о главном.
3. Динамический SQL
Идея динамического SQL заключается в использовании различных тегов динамического SQL для завершения обработки сращивания строк и оценки циклов.
Проблема решена:
В файле сопоставления будет записано много перекрывающихся операторов SQL, таких как оператор SELECT и оператор WHERE.Как быть с этими перекрывающимися операторами?
В операторе SQL есть несколько условий where, но со страницы передается только один параметр условия, и в это время возникает проблема.
3.1 если тег
В случае комплексного запроса условие запроса передается со страницы, а имя пользователя может быть введено или не введено в условие запроса на странице.
<select id="findUserList" parameterType="queryVo" resultType="user"> SELECT * FROM user where 1=1 <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username like '%${user.username}%' </if> </if> </select>
Примечание. Чтобы выполнить проверку строки «не равно пустой».
3.2 где тег
1=1 в приведенном выше sql, хотя целостность оператора sql может быть гарантирована: но есть проблемы с производительностью. Mybatis предоставляет теги where для решения этой проблемы.
Код изменен следующим образом:
<select id="findUserList" parameterType="queryVo" resultType="user"> SELECT * FROM user <!-- where标签会处理它后面的第一个and --> <where> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username like '%${user.username}%' </if> </if> </where> </select>
3.3 фрагмент sql
В файле сопоставления вы можете использовать тег sql для извлечения повторяющегося sql, а затем использовать тег include для ссылки на него и, наконец, достичь цели повторного использования sql Конкретная реализация выглядит следующим образом:
Код в исходном файле сопоставления:
<select id="findUserList" parameterType="queryVo" resultType="user"> SELECT * FROM user <!-- where标签会处理它后面的第一个and --> <where> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username like '%${user.username}%' </if> </if> </where> </select>
Извлеките условие where:
<sql id="query_user_where"> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username like '%${user.username}%' </if> </if> </sql>
Использование включает ссылки:
<!-- 使用包装类型查询用户 使用ognl从对象中取属性值,如果是包装对象可以使用.操作符来取内容部的属性 --> <select id="findUserList" parameterType="queryVo" resultType="user"> SELECT * FROM user <!-- where标签会处理它后面的第一个and --> <where> <include refid="query_user_where"></include> </where>
</select>
Уведомление:
1. Если вы ссылаетесь на другие фрагменты sql mapper.xml, вам необходимо добавить пространство имен при ссылке следующим образом:
<include refid="namespace.sql片段”/>
3.4 foreach
необходимость
При выполнении комплексного запроса передайте несколько идентификаторов для запроса информации о пользователе и используйте следующие две реализации SQL:
SELECT * FROM USER WHERE username LIKE '%老郭%' AND (id =1 OR id =10 OR id=16)
SELECT * FROM USER WHERE username LIKE '%老郭%' AND id IN (1,10,16)
POJO
Определите идентификаторы атрибутов списка в pojo для хранения нескольких идентификаторов пользователей и добавьте методы получения/установки.
Файл сопоставления картографа
<sql id="query_user_where"> <if test="user != null"> <if test="user.username != null and user.username != ''"> AND username like '%${user.username}%' </if> </if> <if test="ids != null and ids.size() > 0"> <!-- collection:指定输入的集合参数的参数名称 --> <!-- item:声明集合参数中的元素变量名 --> <!-- open:集合遍历时,需要拼接到遍历sql语句的前面 --> <!-- close:集合遍历时,需要拼接到遍历sql语句的后面 --> <!-- separator:集合遍历时,需要拼接到遍历sql语句之间的分隔符号 --> <foreach collection="ids" item="id" open=" AND id IN ( " close=" ) " separator=","> #{id} </foreach> </if> </sql>
тестовый код
В тестовом коде UserMapperTest измените метод testFindUserList следующим образом:
@Test public void testFindUserList() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); // 获得mapper的代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 创建QueryVo对象 QueryVo queryVo = new QueryVo(); // 创建user对象 User user = new User(); user.setUsername("老郭");
// 根据queryvo查询用户 List<User> list = userMapper.findUserList(queryVo); System.out.println(list); sqlSession.close(); }
Меры предосторожности
Если параметрType является не типом POJO, а списком или массивом, то в операторе foreach значение атрибута коллекции должно быть зафиксировано как список или массив.
Все статьи в официальном аккаунте написаны авторами блогов и будут постоянно обновляться. Если вы хотите стать свидетелем или расти вместе с блоггерами, добро пожаловать на внимание!