[MyBatis] day03 динамический SQL и механизм кэширования

Глава 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 + параметры]

    • При повторном получении данных в будущем сначала получите их из кэша первого уровня, а затем получите данные из базы данных , если данные не получены .

  • Пять аварийных ситуаций кэша первого уровня

    1. Разные SqlSessions соответствуют разным кешам первого уровня.

    2. Тот же SqlSession, но разные условия запроса

    3. Любые операции добавления, удаления и изменения выполняются во время двух запросов одного и того же SqlSession.

    • Очистить кеш первого уровня

    1. Кэш был очищен вручную во время двух запросов одного и того же SqlSession.

    • sqlSession.clearCache()

    1. Один и тот же 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>
    • Загрузить сторонний кеш [файл сопоставления]

    • начать использовать

  • Меры предосторожности

    • Сторонний кеш нужно строить на основе кеша второго уровня [необходимо включить кеш второго уровня, чтобы сторонний кеш заработал]

    • Как аннулировать сторонний кеш [просто отключите настройки вторичного кеша]

おすすめ

転載: blog.csdn.net/weixin_45481821/article/details/130348295