Процесс выполнения Mybatis Framework:
1. Настройка файла конфигурации mybatis, sqlmapconfig.xml (имя не исправлено)
2. Загрузите среду запуска MyBatis через файлы конфигурации и создайте заводскую сеанс SQLSessionFactory
SQLSessionFactory используется в одиночной форме, когда он фактически используется.
3. Создать SQLSession через SQLSessionFactory
SQLSession-это пользовательский интерфейс (предоставление методов рабочей базы данных). Объект реализации-это небезопасно. Рекомендуется, чтобы сценарий применения SQLSession находился в корпусе метода.
4. Вызовите метод SQLSession, чтобы манипулировать данными.
Если вам нужно совершить транзакцию, вам необходимо выполнить метод Commit () SQLSession.
5. Выпустить ресурсы и закрыть SQLSession
Метод разработки агента Mapper (рекомендуется)
Только программисты должны написать интерфейс Mapper (то есть интерфейс DAO)
Программисты должны следовать спецификации разработки при написании mapper.xml (отображение файлов) и mapper.java:
1. Пространство имен в mapper.xml - полный путь класса Mapper.java.
2. Идентификатор оператора в mappper.xml такой же, как и имя метода в mappper.java.
3. Параметр оператора в mapper.xml указывает тип входного параметра и тип входного параметра метода mapper.java.
4. Результат оператора в mapper.xml указывает тип вывода и тип возвращаемого значения метода mapper.java.
Содержание этой статьи:
Проанализируйте модель данных о продукте заказа.
Усовершенствованное отображение: (учиться)
Реализуйте один к одному запросу, один ко многим и многим-многим запросом.
Задержка загрузки
Кэш запроса
Кэш 1 -го уровня
Кэш уровня 2 (понимайте сценарии использования кэша 2 уровня Mybatis)
Mybatis и Spirng Integration (Master)
Обратная инженерия (может использовать)
Заказать модель данных о продукте
Идеи анализа модели данных
1. Содержание данных, записанное в каждой таблице
Быть знакомым с содержанием, записанным в каждой таблице модулем, эквивалентно процессу требований к системе обучения (функции).
2. Важные настройки поля для каждой таблицы
Непустые поля, поля иностранных ключей
3. Взаимосвязь между таблицами уровня базы данных
Иностранные ключевые отношения
4. Деловые отношения между таблицами
При анализе деловых отношений между таблицами необходимо проанализировать ее на основе определенной значимости бизнеса.
Анализ модели данных
Пользователь пользователя пользователь:
Запишите пользовательную информацию о приобретенном продукте
Таблица заказа: Заказы
Записывает заказ, созданный пользователем (заказ на покупку предметов)
Подробная информация о заказе: OrderDetail:
Запишите подробную информацию заказа, а именно информацию о покупке
Список продуктов: элементы
Записанная информация о продукте
Деловые отношения между таблицами:
При анализе деловых отношений между таблицами необходимо проанализировать ее на основе определенной значимости бизнеса.
Сначала проанализируйте деловую связь между таблицами, которые имеют отношения между уровнями данных:
USRE и заказы:
Пользователь ―-> Заказы: пользователь может создать несколько заказов, один на многие
Заказы -> Пользователь: заказ создается только одним пользователем, один на один
Заказы и OrderDetail:
Заказы> Заказ.
OrderDetail> Заказы: детализация заказа может быть включена только в один заказ, один на один
orderdetail и itemsm:
OrderDetail-> itemsms: один из данных заказа соответствует только одной информации о продукте, один к одному
Элементы> OrderDetail: продукт может быть включен в многочисленные данные заказа, от одного до многих
Затем проанализируйте, существует ли деловая связь между таблицами, которые не связаны с уровнем базы данных:
Заказы и предметы:
Связь между заказом и предметами может быть установлена через таблицу OrderDetail.
Пользователь и элементы: представляют собой отношения между другими таблицами
Один к одному запросу
Требования: Информация о заказе запроса и информация об ассоциации пользователя для создания заказов
Используйте ResultType для запроса
Рассмотрение об использовании операторов SQL
Определите основную таблицу запроса: таблица заказов
Определите таблицу ассоциации для запроса: пользовательский таблица
Использует ли запрос ассоциации внутреннюю ссылку или внешнюю ссылку?
Поскольку в таблице заказов есть иностранный ключ (user_id), можно найти только одну запись, запрашивая таблицу пользователя через ассоциацию иностранных ключей, и можно использовать внутренние ссылки.
Выберите заказы.*, User.username, user.sex, user.address from horders, пользователь, где orders.user_id = user.id
Создать pojo (orderscustom.java)
Сопоставьте результаты приведенного выше SQL -запроса в POJO, который должен включать все имена столбцов запросов.
Первоначальные заказы. Ява не может составить карту всех полей, и требуется недавно созданный POJO.
Создайте класс PO, который наследует класс PO, который включает в себя много полей запросов.
Ordersmappercustom.xml
Ordersmappercustom.java
Напишите тестовые классы
Щелкните правой кнопкой мыши на файл ordersmappercustom.java> выберите «Новые»> «Другие»> «Тест» Junit> Выберите функцию для тестирования
Напишите следующий код в ordersmappercustomtest.java:
public class OrdersMapperCustomTest {private SqlSessionFactory sqlSessionFactory;// This method is to execute @Beforepublic void setUp() throws Exception {// Create sqlSessionFactory// mybatis configuration file String resource = "SqlMapConfig.xml";// Get configuration file stream InputStream inputStream = Resources.getResourceasStream (Resource); // Создать заводскую фабрику сеанса и пройти в файле конфигурации mybatis sqlSessionFactory = new sqlSessionFactoryBuilder (). Build (inputStream);}@testpublic void testfindorderdersuser () exection {sqlSession SqlSession = sqlSessionSessessessy. Ordersmappercustom ordersmappercustom = sqlsession.getmapper (ordersmappercustom.class); // Список методов Mapper Call <OrdersCustom> ordersMapperCustom.findordersUsuser ();Используйте ResultMap для запроса
Заявление SQL: SQL реализован в том же результате
Идеи для использования картирования карты результатов
Используйте ResultMap, чтобы отобразить информацию заказа в результате запроса в объект Orders, добавьте атрибут пользователя в классе заказов и сопоставьте связанную информацию пользователя пользователя в атрибут пользователя в объекте Orders.
Добавить атрибут пользователя в класс заказов
Ordersmappercustom.xml
Определите ResultMap
Tyep: означает сопоставить результаты всего запроса с определенным классом, например: cn.itcast.mybatis.po.orders
Идентификатор: представляет уникальный идентификатор столбца запроса в таблице баз данных, уникальный идентификатор в информации заказа. Если есть несколько столбцов, которые образуют уникальный идентификатор, настройте несколько идентификаторов.
Столбец: Уникальный идентификационный столбец для информации заказа в таблице базы данных
Свойство: какое свойство отображается на заказы с помощью уникального идентификационного столбца информации о заказе?
Ассоциация: используется для картирования информации для запроса отдельных объектов
Свойство: какое свойство в заказе на карту пользовательской информации соответствующего запроса с
Javatype: какое свойство сопоставлено с пользователем
<!-Результат Moster Associated пользователя отображает результат всего запроса на cn.itcast.mybatis.po.orders-> <resultmap type = "cn.itcast.mybatis.po.orders" id = "ordersuserresultmap"> <!-Конфигурировать информацию о нанесении на карту-> <! Если существует несколько столбцов для формирования уникального идентификатора, настройте несколько idcolumn: уникальный столбец идентификации информации о заказе информации: какое свойство в Orders отображается с помощью уникального столбца идентификатора информации-> <id column = "id" property = "id" /> <result column = "user_id" property = "userid" /> cretulte = "properation =" cumber " /> <resultem Column = "Примечание" Property = note/> <!-Настройте сопоставленную связанную информацию пользователя-> <!-Ассоциация: информация, используемая для составления соответствующего запроса. javatype: какое свойство сопоставлено с пользователем -> <id column = "user_id" property = "id"/> <result column = "username" property = "username"/> <result column = "sex" Property = "sex"/> <result column = "addrest" address "/> <</association> </resultmap>
Определение заявления
Ordersmappercustom.java
Тестовый код
@Testpublic void testfinderserserresultmap () throws exception {sqlSession sqlSession = sqlSessionFactory.opensession (); // Создать прокси -объект ordersmappercustom ordersmappercustom = callsession.getmapper (ordersmappercustom.class); ordersmappercustom.findordersuserresultmap (); System.out.println (list); sqlsession.close ();}ResultType и ResultMap реализовывать резюме запроса один на один
ResultType: Относительно просто реализовать с помощью ResultType. Если имя столбца запроса не включено в POJO, вам необходимо добавить соответствующие атрибуты имени столбца, чтобы завершить отображение.
Если нет особых требований для результатов запроса, рекомендуется использовать Restultype.
Результат -карта: карта результата должна быть определена отдельно, что немного хлопотно. Если есть особые требования для результатов запроса, использование ResultMap может завершить атрибуты соответствующего отображения запросов POJO.
ResultMap может реализовать ленивую загрузку, ResultType не может реализовать ленивую загрузку.
Один ко многим запрос
Требования: Заказы запросов и информация о заказах.
Заявление SQL
Определите основную таблицу запросов: таблица заказов
Определите связанную таблицу запросов: Таблица сведений за заказ
Просто добавьте ассоциацию списков сведений о заказах на основе запроса один на один.
Selectorders.*, User.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_idfromorders, user, orderdetailwhere orders.user_id = user.iddetail.orders_id = ordersailwhere.
Анализ: используйте ResultType для сопоставления приведенных выше результатов запроса в POJO, а информация о заказе является дублированием.
Требование: дубликаты записей не могут произойти для картирования заказов.
Добавьте свойство List <OrderDetail> свойство OrderDetails в классе orders.java.
Наконец, информация о заказе будет сопоставлена с заказом, а данные заказа, соответствующие заказу, сопоставлены с свойством OrderDetails в заказе.
Количество заказов, записанных в сопоставлении, составляет два (заказы не повторяются)
Свойство OrderDetails в каждом заказе хранит данные заказа, соответствующие заказу.
Добавить атрибут сведений о заказа списка в orders.java
Ordersmappercustom.xml
Результат определения
Использовать наследование расширяет без настройки картирования информации о заказе и информации пользователя в
Коллекция: Запрос нескольких записей для карты объекта Collection для запроса ассоциации
Собственность: Карта запроса ассоциации с несколькими записями с cn.itcast.mybatis.po.orders Какая собственность сопоставлена с cn.itcast.mybatis.po.orders
OfType: указывает тип, который карты для Pojo в атрибуте коллекции списка
<!-Результат карты для заказов и данных заказа унаследована с использованием Extends, и не нужно настроить отображение информации о заказе и информации пользователя в нем-> <resultMap Type = "cn.itcast.mybatis.po.orders" id = "ordersandorderdetailResultmap" extends = "ordersUrsultmult-map"> <! Унаследование, не нужно настраивать отображение информации о заказе и информации пользователя в нем-> <!-Подробная информация Закана Информация. Запрос Ассоциации заказа имеет несколько подробностей. Для использования коллекции для карт коллекция: карта несколько записей в Свойство объекта Collection: Запрос ассоциации карт для нескольких записей в cn.itcast.mybatis.po.orders, какое свойство Oftype: укажите тип карты POJO для списков Свойства коллекции-> <Collection Property = "orderdetails" oftype = "cn.itcast.mybatis.po.po. identifier of the order details to cn.itcast.mybatis.po.Orderdetail--><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/></collection></resultMap>
Ordersmappercustom.java
Тестовый код:
@Testpublic void testfinderserdersandorderdetailResultmap () throws exception {sqlSession sqlSession = sqlSessionFactory.opensession (); // Создать proxy Object OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper (ordersmappercustom. ordersmappercustom.findordersandorderdetailresultmap (); system.out.println (list); sqlsession.close ();}краткое содержание
Mybatis использует коллекцию ResultMap для составления нескольких записей соответствующего запроса в свойство сбора списков.
Реализация с использованием ResultType:
Сопоставление информации о заказе в OrderDetails В заказе вам нужно обрабатывать его самостоятельно, использовать двойной цикл для прохождения, удаления дублирующих записей и разместить данные заказа в Orcondetails.
Много-милый запрос
Требования: запрос пользователей и информация о покупке пользователей.
Заявление SQL
Основная таблица запроса: пользовательский таблица
Таблица ассоциации: Поскольку пользователь и продукт не связаны напрямую, они связаны с помощью заказов и данных заказа, поэтому таблица ассоциации: Заказы, OrderDetail, элементы
Выберите заказы.*, User.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price_price_price_price_price_price_price_price_price_pricefromerers, userdet, itempail, wordestail. user.id и orderdetail.orders_id = orders.id и orderdetail.items_id = item.id
Картирование идей
Карта пользовательской информации в пользователь.
Добавить список атрибутов списка заказов <Orders> OrdersList в классе пользователя, чтобы отобразить заказы, созданные пользователем в OrdersList
Добавить Список СПОЗВАНИИ СТИПЛЕТА ПО ЗАРЕНИИ
Добавьте свойство элементов в Orfendetail, чтобы отобразить элементы, соответствующие данным заказа, элементам
Ordersmappercustom.xml
Результат определения
<!-Запросите пользователя и приобретенные продукты-> <resultmap type = "cn.itcast.mybatis.po.user" id = "useranditemsresultmap"> <!-Информация пользователя-> <id column = "user_id" property = "id"/> <result column = "username" property = "usermaname"/> <result column = "selece"/ressult ressure = "result"/result result "/"/"/" "/" result "/" result "/" result "/" result "/" result "/" result ". property="address"/><!-- Order information A user corresponds to multiple orders, and use collection mapping--><collection property="ordersList" ofType="cn.itcast.mybatis.po.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"/> <!-Подробная информация о заказе Один заказ включает в себя несколько подробностей-> <Collection Property = "OrderDetails" ofType = "cn.itcast.mybatis.po.orderdetail"> <id column = "orderdetail_id" propertive = "id"/> <result vecultail "iteps =" stecemid "intoprond"/"stocture"/> "stecum stertive"/> "stoclive"/> "stecum vesture". Property = "itemsnum"/> <result column = "orders_id" Property = "ordersId"/> <!-Информация о продукте. Подробная информация о заказа соответствует продукту-> <Association Property = "eptions" javatype = "cn.itcast.mybatis.po.items"> <id column = "items_id" = "id"/> <results. Column = "items_detail" Property = "Detail"/> <result column = "items_price" property = "price"/> </association> </collection> </collection> </resultmap>
Ordersmappercustom.java
Тестовый код:
@Testpublic void testfinduseranditemsresultmap () throws exception {sqlsession sqlsession = sqlSessionFactory.opensession (); // Создание proxy Object OrdersMapperCustom ordersMapperCustom = sqlSession.getmapper (ordersmappercustom.class); ordersmappercustom.finduseranditemsresultmap (); System.out.println (list); sqlsession.close ();} Краткое изложение запросов многих ко многим
Подробный список информации о продукте, приобретенной пользователем, будет проверен (имя пользователя, адрес пользователя, имя продукта, время покупки, количество покупки)
В ответ на вышеуказанные требования мы используем ResultType для сопоставления записей запросов в расширенный POJO, который очень просто реализовать функцию подробного списка.
Один-млн-это особый случай многих ко многим, следующим образом:
При запросе информации о продукте, приобретенной пользователями, взаимосвязь между пользователем и продуктом-это многие ко многим отношениям.
Требование 1:
Поля запроса: учетная запись пользователя, имя пользователя, пол пользователя, название продукта, цена продукта (наиболее распространенная)
Общие подробные списки в разработке предприятий, подробные списки продуктов, приобретенных пользователями,
Используйте ResultType, чтобы отобразить столбец вышеуказанного запроса на вывод POJO.
Требование 2:
Поля запросов: учетная запись пользователя, имя пользователя, количество приобретенных предметов, детали продукта (мышь для отображения)
Используйте ResultMap, чтобы отобразить список полученных данных о продукте пользователя в пользовательском объекте.
Суммировать:
Использование ResultMap предназначена для тех функций, которые имеют особые требования для отображения результатов запроса, такие как отображение специальных требований в списки, включая несколько списков.
Резюме ResultType и ResultMap
ResultType:
эффект:
Карту запроса результаты в Pojo в соответствии с названием столбца SQL POJO ATTRIBUT
повод:
Общее отображение подробных записей, например, когда пользователи приобретают данные о продукте и отображают всю связанную информацию запроса на странице, вы можете напрямую использовать Restultype для картирования каждой записи.
Снимите в Pojo и пройдите список (Pojo в списке) на линейной странице.
ResultMap:
Используйте ассоциацию и коллекцию, чтобы завершить усовершенствованное картирование от одного к одному и один-один (существуют специальные требования к отображению для результатов).
Ассоциация:
эффект:
Сопоставьте связанную информацию запроса в объект POJO.
повод:
Чтобы облегчить запрос связанной информации, вы можете использовать ассоциацию для карты связанной информации о заказе в атрибутах POJO объектов пользователей, таких как: запросы заказов и связанная с ними информация пользователя.
Использование ResultType не может сопоставить результаты запроса с атрибутом POJO объекта POJO. Выберите, использовать ли ResultType или ResultMap в соответствии с потребностями прохождения запроса набора результатов.
Коллекция:
эффект:
Сопоставьте связанную информацию запроса в коллекцию списков.
повод:
Чтобы облегчить запрос информации об ассоциации обхода, вы можете использовать сбор для карты информации об ассоциации в коллекцию списков, такую как: запрос модуля с разрешением пользователя и меню под модулем, вы можете использовать коллекцию для составления списка модулей для картирования атрибутов списка меню объекта модуля. Цель этого также состоит в том, чтобы облегчить обход, запросив набор результатов запроса.
Если вы используете ResultType, вы не можете сопоставить результаты запроса в коллекцию списков.
Задержка загрузки
ResultMap может реализовать расширенное отображение (с использованием ассоциации и сбора для реализации картирования из одного к одному и одному ко многим). Ассоциация и коллекция имеют ленивые функции загрузки.
нуждаться:
Если заказ запрашивается и информация пользователя связана. Если мы сначала запросите информацию о заказе в соответствии с требованиями, мы рассмотрим информацию о пользователе, когда нам нужно запросить информацию пользователя. Запрос информации пользователя о спросе задерживается загрузка.
Задержка загрузки: сначала запрос из одной таблицы, а затем из связанной таблицы, когда это необходимо, значительно улучшая производительность базы данных, поскольку запрос одной таблицы быстрее, чем запросы с несколькими таблицами.
Используйте ассоциацию для реализации ленивой загрузки
Требования: Заказы запросов и информация об ассоциации пользователя
Ordresmappercustom.xml
Необходимо определить утверждение, соответствующее двум методам Mapper.
1. Только информация о заказе запроса
Выберите * из заказов
Используйте ассоциацию, чтобы задержать загрузку (выполнить) Следующее удовлетворение (информация пользователя Ассоциации) в операторе заказа запроса
2. Связанная информация пользователя запроса
User_id используется для запроса информации о пользователе, следуя пользователю_ид в приведенном выше запросе на заказ
Используйте finduserbyid в usermapper.xml
Выше приведенное сначала выполняет FindordersUserLazyLoadling, и когда вам нужно запросить пользователя, затем выполняет FindUserByID, а задержка загрузки и выполнения настроены через определение ResultMap.
Задержка загрузки ResultMap
Используйте Select в ассоциации, чтобы указать идентификатор оператора, который будет выполнен с помощью ленивой загрузки.
<!-Lazy Looled ResultMap-> <resultMap type = "cn.itcast.mybatis.po.orders" id = "ordersuserlazyloadingresultmap"> <!-Конфигурация картирования информации о заказе-> <id Column = "ID" Property = "ID"/> <result Column = "user_id" property = "userID"/> <result ". column="createtime" property="createtime"/><result column="note" property="note"/><!-- Mapping configuration of order information--><id column="id" property="user_id" property="userId"/><result column="number" property="number"/><result column="createtime"/><result column="note" property="note"/><!-- Implement delay loading of user information
Выберите: Укажите идентификатор оператора, который будет выполнен для ленивой загрузки (оператор, который запросит информацию пользователя на основе user_id)
Для использования FindeSerbyId в usermapper.xml для завершения запроса на основе информации пользователя (user_id). Если Finduserbyid не в этом карте, вам нужно добавить пространство имен перед ним.
Столбец: Столбец в информации заказа, связанной с запросом информации о пользователе, является user_id
Запрос SQL для ассоциации понимается как:
Выберите Заказы.*, (Выберите имя пользователя из пользователя, где orders.user_id = user.id) Имя пользователя, (выберите пол из пользователя, где orders.user_id = user.id). column = "user_id"> <!-реализовать ленивую загрузку информации пользователя-> </association> </resultmap>
Orderesmappercustom.java
Идеи тестирования:
1. Выполните приведенный выше метод Mapper (FindordersuserLazyLoading) и вызовите FindordersuserLazyLoging в cn.itcast.mybatis.mapper.ordersmappercustom, чтобы только запросить информацию о заказе (одиночная таблица).
2. В программе пройдите список <Заказы> Запрошенные на предыдущем шаге. Когда мы называем метод GetUser в заказе, мы начинаем ленивую загрузку.
3. Задержка загрузки, вызовите метод FindEuserByID в usermapper.xml, чтобы получить пользовательскую информацию.
Ленивая нагрузка конфигурация
Mybatis не включает ленивую загрузку по умолчанию, и его необходимо настроить в sqlmapconfig.xml.
Настройка в файле конфигурации Mybatis Core:
Установите элемент Описание допустимое значение значения по умолчанию
LazyLoadingEnabled Globally Установите ленивую загрузку. Если установить на «false», все связанные инициализируются и загружены. истинно или ложь
AggeressIvelazyLoging При установке на «true» ленивые объекты загрузки могут быть загружены всеми ленивыми свойствами. В противном случае каждое свойство загружается по мере необходимости. Верно или ложное истинное
Конфигурация в sqlmapconfig.xml:
Тестовый код
Думать о задержке загрузки
Как достичь ленивой загрузки без использования ассоциации и коллекции, предоставленных Mybatis?
Метод реализации выглядит следующим образом:
Определите два метода Mapper:
1. Запрос список заказа
2. Запрос информации пользователя на основе идентификатора пользователя
Идеи реализации:
Сначала проверьте первый метод Mapper и получите список информации о заказе
В программе (служба) вызовите второй метод Mapper по мере необходимости, чтобы запросить информацию пользователя.
Короче говоря: используйте метод ленивого загрузки для запроса простого SQL (предпочтительно одну таблицу, вы также можете связать запросы), а затем загрузить другую информацию связанных запросов по мере необходимости.
Кэш запроса
Mybatis предоставляет кэши запросов для снижения давления данных и повышения производительности базы данных.
MyBaits обеспечивает кэш первого уровня и кэш второго уровня.
Кэш 1-го уровня-это кэш на уровне SQLSession. При использовании базы данных вам необходимо построить объект SQLSession, и в объекте есть структура данных (HashMAP) для хранения кэшированных данных. Кэшированные области данных (Hashmaps) между различными SQLSessions не влияют друг на друга.
Вторичный кэш-это кэш на уровне Mapper. Несколько SQLSessions управляют операторами SQL одного и того же картера. Несколько SQLSessions могут делиться вторичным кэшем. Вторичный кэш-это перекрестная кв.
Зачем использовать кеш?
Если в кэше есть данные, вам не нужно получать их из базы данных, что значительно повышает производительность системы.
Кэш 1 -го уровня
Принцип работы кэширования первого уровня
В первый раз, когда я инициировал запрос информации пользователя с идентификатором пользователя 1, сначала посмотрите, есть ли пользовательская информация с информацией пользователя с идентификатором 1 в кэше. Если нет, запросите информацию пользователя из базы данных.
Получите информацию пользователя и сохраните информацию пользователя в кэше первого уровня.
Если SQLSession выполняет операции коммита (выполняет вставку, обновление и удаление), очищает кеш первого уровня в SQLSession. Цель этого состоит в том, чтобы сделать Cache Hore последней информацией и избежать грязного чтения.
Во второй раз я инициировал запрос информации пользователя с идентификатором пользователя 1, сначала посмотрите, есть ли пользовательская информация с информацией пользователя с идентификатором 1 в кэше. Если в кэше есть один, я буду напрямую получать пользовательскую информацию из кэша.
Тестирование кеша 1 -го уровня
Mybatis поддерживает кэширование первого уровня по умолчанию и не нужно настроить в файле конфигурации.
Следуйте вышеуказанному уровню принципа кеша для проверки.
//Ordersmappercusntomtest.java@testpublic void testcache1 () Throws Exception {sqlSession sqlSession = sqlSessionFactory.opensession (); // Создание объекта proxy usermapper usermapper = sqlsession.getmapper (usermapper.class); Инициирован и пользователь с идентификатором 1 является запросом пользователя user1 = usermapper.finduserbyid (1); System.out.println (user1); // Если sqlSession выполняет операции коммит (выполняет вставку, обновление и удаление), очищает кэш первого уровня в SQLSession. Цель этого состоит в том, чтобы сделать Cache Hore последней информацией и избежать грязного чтения. // Обновление информации user1 user1.setusername ("test user22"); usermapper.updateuser (user1); // выполнить операцию коммита, чтобы очистить кэш sqlsession.commit (); // запустить второй запрос и запросить пользователя с идентификатором 1 user2 = usermapper.finduserbyid (1); System.out.println (user2); sqlsession.close (1);Кэш -приложение уровня 1
Формальная разработка заключается в интеграции Mybatis и Spring, а транзакции контролируются в эксплуатации.
Метод обслуживания включает в себя множество вызовов метода Mapper.
Service {// При начале выполнения запустите транзакцию и создайте объект SQLSession // вызовите метод Mapper на первый раз, когда FindUserById (1) // Сочирать метод Mapper для второго раз, когда FINDUSERBYID (1), получение данных из кэша первого уровня // Метод заканчивается, SQLSession закрыт}, заканчиваетсяЕсли вы выполняете два сервисных вызова, чтобы запросить одну и ту же информацию пользователя, вы не перейдете в кэш первого уровня, поскольку метод сеанса заканчивается, SQLSession будет закрыт, а кэш первого уровня будет очищен.
Кэш 2 уровня
принцип
Во -первых, включите кэш второго уровня Mybatis.
SQLSession1 Querss Information с идентификатором пользователя 1. При запросе информации пользователя данные запроса будут сохранены во вторичном кэше.
Если SQLSession3 выполняет SQL под той же картой, выполняет представление Commit и очищает данные в области вторичного кэша под Mapper.
SQLSession2 Запрашивает информацию пользователя с помощью идентификатора 1 пользователя и обнаруживает, есть ли данные в кэше. Если он существует, данные напрямую извлекаются из кэша.
Разница между вторичным кэшем и первичным кэшем больше. Диапазон вторичного кеша больше. Несколько SQLSessions могут поделиться областью вторичного кеша USERMAPPER.
У Usermapper есть область вторичного кеша (подразделяемой по пространству имен), а другие Mapppers также имеют свою собственную область вторичного кеша (подразделенная по пространству имен).
Каждый Mapper пространства имен имеет вторую область кеша. Если пространство имен двух отображающих одинаково, два уровня будут иметь одинаковую область второго кэша, когда данные выполняются SQL.
Включите кеш 2 -го уровня
Кэш второго уровня MyBaits-это уровень диапазона Mapper. В дополнение к установке основного переключателя кэша второго уровня в sqlmapconfig.xml, кэш второго уровня также должен быть включен в конкретном mapper.xml.
Добавлено в файл конфигурации ядра sqlmapconfig.xml
<Настройка name = "cacheenabled" value = "true"/>
Описание разрешенное значение значения по умолчанию
Cacheenabled в глобальном уровне настройки/выключение для всех кэшей в соответствии с этим файлом конфигурации. истинно или ложь
Включите вторичный кэш в usermapper.xml, и выполнение SQL в соответствии с Usermapper.xml будет храниться в области кэша (Hashmap).
Позвоните в класс POJO, чтобы реализовать интерфейс сериализации
Чтобы извлечь кэшированные данные, выполняются операции десериализации, поскольку средние среды для хранения данных вторичного кэширования разнообразны и различны по памяти.
Тест кеша 2 -го уровня
@Testpublic void testCache2() throws Exception {SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();SqlSession sqlSession3 = sqlSessionFactory.openSession();// Create proxy object UserMapper userMapper1 = sqlSession1.getMapper (usermapper.class); // Инициировать первый запрос и запросить пользователя с идентификатором 1 пользователя user1 = usermapper1.finduserbyid (1); system.out.println (user1); // выполнить тесную операцию здесь и написать данные в SqlSession Secleary SqlesessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessessESSE1. выполнить операцию commite () usermapper usermapper3 = sqlsession3.getmapper (usermapper.class); user user = usermapper3.finduserbyid (1); user.setusernam sqlSession3.commit (); sqlSession3.close (); usermapper usermapper2 = sqlSession2.getMapper (usermapper.class); // Отправить второй запрос для запроса пользователя с идентификатором 1 пользователя2 = usermapper2.finduserbyid (1); System.out.println (user2);Конфигурация usecache
Установка usecache = false в операторе может отключить вторичный кэш текущего оператора SELECT, то есть каждый запрос выпустит SQL в запрос. По умолчанию верно, то есть SQL использует вторичный кэш.
<select id = "findorderlistresultmap" resultmap = "ordersusermap" usecache = "false">
Резюме: Для каждого запроса требуются последние данные SQL. Установите его на usecache = false и отключите вторичный кэш.
Обновить кеш
Просто очистить кеш
В одном и том же пространстве имен Mapper, если есть другие данные вставки, обновления или удаления работы, кэш должен быть обновлен, и если кэш не обновляется, произойдет грязное чтение.
Установите свойство FlushCache = »в конфигурации оператора. По умолчанию это правда, что означает, что кэш обновляется. Если он будет изменен на ложь, он не будет обновляться. При использовании кэша грязные чтения произойдут, если вы вручную изменяете данные запроса в таблице баз данных.
<INSERT ID = "INSERTUSER" PARAMETERTYPE = "CN.ITCAST.MYBATIS.PO.USER" flushCache = "true">
Резюме: Как правило, после выполнения операции коммита кэш должен быть обновлен. FlushCache = True означает обновление кэша, который может избежать грязного чтения базы данных.
Mybatis Integration ehcache
Ehcache - это распределенная структура кэширования.
Распределенный кеш
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。