Глава 9 Mybatis Dynamic SQL [Ключевые моменты]
Комментарии в SQL
// первый способ -- 1=1 //Метод 2 [рекомендуемое использование] <!-- 1=1 -->
9.1 Обзор динамического SQL
-
Динамический SQL означает: операторы SQL могут быть динамическими.
-
Динамический SQL Mybatis поддерживает язык выражений OGNL, язык навигации по объектному графу OGNL (Object Graph Navigation Language).
9.2 Обычно используемые ярлыки
-
если тег : используется для завершения простых суждений
-
Тег where : используется для решения ключевого слова where и первого и / или после, где
-
тег обрезки : вы можете добавлять или удалять определенные символы до и после условно оцененного оператора SQL.
-
префикс: добавить префикс
-
prefixOverrides: удалить префикс
-
суффикс: добавить суффикс
-
suffixOverrides: удалить суффикс
-
-
set tag : в основном используется для решения ключевого слова set и еще одной проблемы [,]
-
выберите тег : аналогично структуре if-else [switch-case] в java
-
Тег foreach : аналогичен циклу for в java.
-
коллекция: коллекция для повторения
-
item: элемент, который в данный момент повторяется из коллекции
-
separator: разделитель между элементами
-
открыть: начальный символ
-
закрыть: конечный символ
-
-
Тег sql : извлечение многократно используемых фрагментов SQL
9.3 Пример кода
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
<sql id="emp_col">
id,
last_name,
email,
salary
</sql>
<sql id="select_employee">
select
id,
last_name,
email,
salary
from
tbl_employee
</sql>
<!-- 按条件查询员工信息【条件不确定】-->
<select id="selectEmpByOpr" resultType="employee">
<include refid="select_employee"></include>
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="lastName != null">
and last_name = #{lastName}
</if>
<if test="email != null">
and email = #{email}
</if>
<if test="salary != null">
and salary = #{salary}
</if>
</where>
</select>
<select id="selectEmpByOprTrim" resultType="employee">
<include refid="select_employee"></include>
<trim prefix="where" suffixOverrides="and">
<if test="id != null">
id = #{id} and
</if>
<if test="lastName != null">
last_name = #{lastName} and
</if>
<if test="email != null">
email = #{email} and
</if>
<if test="salary != null">
salary = #{salary}
</if>
</trim>
</select>
<update id="updateEmpByOpr">
update
tbl_employee
<set>
<if test="lastName != null">
last_name=#{lastName},
</if>
<if test="email != null">
email=#{email},
</if>
<if test="salary != null">
salary=#{salary}
</if>
</set>
where
id = #{id}
</update>
<select id="selectEmpByOneOpr" resultType="employee">
select
<include refid="emp_col"></include>
from
tbl_employee
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="lastName != null">
last_name = #{lastName}
</when>
<when test="email != null">
email = #{email}
</when>
<when test="salary != null">
salary = #{salary}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
<select id="selectEmpByIds" resultType="employee">
select
id,
last_name,
email,
salary
from
tbl_employee
<where>
id in(
<foreach collection="ids" item="id" separator=",">
#{id}
</foreach>
)
</where>
</select>
<insert id="batchInsertEmp">
INSERT INTO
tbl_employee(last_name,email,salary)
VALUES
<foreach collection="employees" item="emp" separator=",">
(#{emp.lastName},#{emp.email},#{emp.salary})
</foreach>
</insert>
</mapper>
Глава 10. Механизм кэширования в Mybatis
10.1 Обзор кэширования
-
Кэш в жизни
-
Кэшировать некоторые аудио, видео преимущества
-
экономить трафик данных
-
Улучшение воспроизведения
-
-
-
Кэш в программе [Mybatis cache]
-
Преимущества использования кэширования
-
Повышение эффективности запросов
-
Уменьшите нагрузку на сервер
-
-
10.2 Обзор кэширования в Mybatis
-
Кэш L1
-
Кэш L2
-
сторонний кеш
10.3 Кэш уровня 1 механизма кэширования Mybatis
-
Обзор: кэш уровня 1 [локальный кэш или кэш уровня SqlSession]
-
функции
-
Кэш 1-го уровня включен по умолчанию.
-
не может быть закрыт
-
можно опустошить
-
-
Принцип кэширования
-
При первом получении данных сначала загрузите данные из базы данных и кэшируйте данные в кеше первого уровня Mybatis [кэширование, лежащее в основе принципа реализации Карта, ключ: hashCode + запрос SqlId + письменный оператор запроса sql + параметры]
-
При повторном получении данных в будущем сначала получите их из кэша первого уровня, а затем получите данные из базы данных , если данные не получены .
-
-
Пять аварийных ситуаций кэша первого уровня
-
Разные SqlSessions соответствуют разным кешам первого уровня.
-
Тот же SqlSession, но разные условия запроса
-
Любые операции добавления, удаления и изменения выполняются во время двух запросов одного и того же SqlSession.
-
Очистить кеш первого уровня
-
Кэш был очищен вручную во время двух запросов одного и того же SqlSession.
-
sqlSession.clearCache()
-
Один и тот же SqlSession зафиксировал транзакцию во время двух запросов
-
sqlSession.commit()
-
10.4 Кэш второго уровня механизма кэширования Mybatis
-
Кэш второго уровня [кеш второго уровня] обзор
-
Кэш второго уровня [кэш глобальной области видимости]
-
Кэш уровня SqlSessionFactory
-
-
Возможности кэша L2
-
Кэш второго уровня по умолчанию отключен, и его необходимо включить, прежде чем его можно будет использовать.
-
Кэш второго уровня будет кэшироваться только тогда, когда необходимо отправить sqlSession или закрыть sqlSession.
-
-
Шаги для использования кэша второго уровня:
① Включите вторичный кеш в файле глобальной конфигурации <setting name="cacheEnabled" value="true"/>
② Используйте кэш конфигурации кэша <cache /> в файле сопоставления , который должен использовать кэш второго уровня.
③ Примечание. POJO необходимо реализовать интерфейс Serializable.
④ При закрытии sqlSession или отправке sqlSession кэшируйте данные в кэш второго уровня.
-
Основополагающий принцип кэша второго уровня
-
При получении данных в первый раз сначала получить данные из базы данных и кэшировать данные в кэше первого уровня; при отправке или закрытии SqlSession кэшировать данные в кэше второго уровня
-
При повторном получении данных в будущем сначала получите данные из кеша первого уровня.Если в кеше первого уровня нет указанных данных, перейдите к кешу второго уровня для получения данных. Если в кеше второго уровня не указаны данные, вам нужно обратиться к базе данных, чтобы получить данные,...
-
-
Свойства, связанные с кешем второго уровня
-
eviction="FIFO": стратегия очистки кэша [переработка].
-
LRU — наименее использовавшиеся: удаляет объекты, которые не использовались в течение длительного времени.
-
FIFO — первый пришел, первый ушел: объекты удаляются в том порядке, в котором они попали в кеш.
-
-
flushInterval: интервал обновления в миллисекундах
-
размер: количество ссылок, положительное целое число
-
readOnly: только чтение, true/false
-
-
Инвалидация кеша второго уровня
-
Между двумя запросами операции добавления, удаления и изменения одновременно очищают кеш первого уровня и кеш второго уровня.
-
sqlSession.clearCache(): используется только для очистки кеша первого уровня.
-
10.5 Сторонний кэш механизма кэширования в Mybatis
-
Сторонний кеш: EhCache
-
EhCache — это среда внутрипроцессного кэширования на чистом языке Java.
-
Шаги для использования
-
импортный пакет jar
<!-- mybatis-ehcache --> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.3</version> </dependency> <!-- slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.2</version> <scope>test</scope> </dependency>
-
Напишите файл конфигурации [ehcache.xml]
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 磁盘保存路径 --> <diskStore path="E:\mybatis\ehcache" /> <defaultCache maxElementsInMemory="512" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache>
-
Загрузить сторонний кеш [файл сопоставления]
-
начать использовать
-
-
Меры предосторожности
-
Сторонний кеш нужно строить на основе кеша второго уровня [необходимо включить кеш второго уровня, чтобы сторонний кеш заработал]
-
Как аннулировать сторонний кеш [просто отключите настройки вторичного кеша]
-