предисловие
В этой статье в основном объясняются следующие моменты знания Mybatis:
- Тайник Мибатиса
- Кэш L1
- Кэш L2
- Интеграция с Ehcache
- Картографический прокси
- Вам не нужно писать классы реализации при использовании прокси-сервера Mapper
- Разобрать механизм с целью понять, как это работает
- Автоматически генерировать код
Тайник Мибатиса
Значение кэша
- ПользовательЧасто запрашиваемые данные помещаются в кеш (память), пользователю не нужно запрашивать данные с диска (файл данных реляционной базы данных),Запрос из кеша, тем самым повышая эффективность запроса, который решает проблему производительности систем с высокой степенью параллелизма.
mybatis предоставляет кеш первого уровня и кеш второго уровня
- Кэш уровня 1 Mybatis является уровнем SqlSession, sqlsession может получить доступ только к своим собственным данным кеша уровня 1.
- Кэш второго уровня — это кросс-sqlsession и кэш уровня преобразователя.Различные сеансы sql с разными кэшами уровня преобразователя могут совместно использоваться.
Прочитав приведенное выше объяснение тайника Mybatis, мы обнаружили, чтоКэш Mybatis очень похож на кеш Hibernate.из..
Кэш первого уровня Mybatis
Принцип кэширования первого уровня Mybatis:
При первом выполнении запроса sql результат запроса sql записывается в кеш первого уровня sqlsession, а структура данных, используемая кешем, представляет собой карту.
- ключ: hashcode+sql+sql входной параметр + выходной параметр (уникальный идентификатор sql)
- значение: информация о пользователе
Если тот же sqlsession снова выдаст тот же sql, базу данных нельзя будет взять из кеша. Если операция фиксации (модификация, добавление, удаление) происходит в середине двух раз, область кеша первого уровня в этом сеансе sql очищается, и в следующий раз, когда вы обращаетесь к кешу для запроса, вам нужно запросить из база данных, из запроса к базе данных для записи в кеш.
Стоит отметить кэш первого уровня Mybatis:
- Mybatis по умолчанию поддерживает кеш первого уровня и не требует от нас настройки.
- После интеграции mybatis и spring ведется разработка прокси маппера, который не поддерживает кеш первого уровня, а также интеграцию mybatis и spring.Spring генерирует прокси-объект сопоставления в соответствии с шаблоном сопоставления, и сеанс sqlsession равномерно закрывается в конце шаблона.
Кэш Mybatis второго уровня
Принцип кэширования второго уровня:
Область действия вторичного кеша — это уровень преобразователя (преобразователь имеет то же пространство имен).Преобразователь создает структуру данных кеша в единицах пространства имен, а структура — это map
Конфигурация кеша Mybatis L2
Нам нужно настроить кеш второго уровня в конфигурационном файле Mybatis
<!-- 全局配置参数 -->
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
Как упоминалось выше, область кэша второго уровня находится на уровне картографа, поэтому нашаЕсли Mapper хочет использовать кэш второго уровня, его также необходимо настроить в соответствующем файле сопоставления...
<cache/>
pojo сериализация сопоставления результатов запроса
Вторичный кеш mybatis должен реализовать интерфейс java.io.serializable для pojo, который отображает результаты запроса и выдает исключение, если это не так:
org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: cn.itcast.mybatis.po.User
Кэш второго уровня может записывать данные из памяти на диск, и есть сериализация и десериализация объектов., поэтому реализуйте интерфейс java.io.serializable. Если pojo отображения результатов также включает pojo, должен быть реализован интерфейс java.io.serializable.
Отключить кеш L2
Для часто меняющегося SQL необходимо отключить кеш второго уровня:
Установите useCache=false в операторе, чтобы отключить кеш второго уровня текущего оператора выбора., то есть каждый запрос будет выдавать sql to query, **по умолчанию true, ** то есть sql использует кеш второго уровня. ,
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
очистить кеш
У некоторых студентов может возникнуть вопрос:Почему мы настраиваем кеш в операторе запроса? ? При использовании дополнений, удалений и модификаций кеш будет очищаться по умолчанию [обновляться]? ? ?
Кэш фактически обслуживает наш запрос.Для добавлений, удалений и изменений, если нашиКэш сохраняет данные после добавления, удаления и изменения, поэтому при повторном чтении вы прочитаете грязные данные!
В некоторых случаях мы также можем настроить кэш обновления отдельно [но не рекомендуется использовать] flushCache, значение по умолчанию true
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User" flushCache="false">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
Разобраться с некоторыми параметрами кеша Mybatis
Параметр кеша mybatis применяется только к кешу обслуживания mybatis.
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
如下例子:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU:
1.LRU – 最近最少使用的:移除最长时间不被使用的对象。
2.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
3.SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
4.WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
Интеграция фреймворка кэширования mybatis и ehcache
Ehcache специально используется для управления кешем. Было бы более уместно, чтобы кеш Mybatis управлялся с помощью ehcache...
существуетИнтерфейс кеша предоставляется в MyBatis, пока реализован интерфейс кеша, данные кэша могут быть гибко управляться.
Интегрировать пакет jar
- mybatis-ehcache-1.0.2.jar
- ehcache-core-2.6.5.jar
Класс реализации ehcache для интерфейса кеша:
Информация о конфигурации ehcache.xml
Этот файл конфигурации xml является конфигурациейСхема управления глобальным кэшем
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--diskStore:缓存数据持久化的目录 地址 -->
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
diskPersistent="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
Если наш Mapper хочет иметь некоторые функции отдельно, нам нужно настроить его отдельно в mapper.xml.
<!-- 单位:毫秒 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
<property name="timeToIdleSeconds" value="12000"/>
<property name="timeToLiveSeconds" value="3600"/>
<!-- 同ehcache参数maxElementsInMemory -->
<property name="maxEntriesLocalHeap" value="1000"/>
<!-- 同ehcache参数maxElementsOnDisk -->
<property name="maxEntriesLocalDisk" value="10000000"/>
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>
Сценарии применения и ограничения
Сценарии применения
Для данных с высокой частотой запросов и низкой частотой изменений рекомендуется использовать кэш L2.
заЗапросов много, и пользователи не предъявляют высоких требований к результатам запросов в реальном времени., в настоящее время технология вторичного кэша mybatis может использоваться для уменьшения количества обращений к базе данных и повышения скорости доступа.
Бизнес-сценарии, такие как:
- трудоемкий статистический анализ sql,
- SQL-запрос счета за телефон и т. д.
Метод реализации следующий:При установке интервала обновления кэш автоматически очищается mybatis через равные промежутки времени, а интервал обновления кэша flushInterval устанавливается в соответствии с частотой изменения данных., например, установите его на 30 минут, 60 минут, 24 часа и т. д. в зависимости от ваших потребностей.
ограничение
ограничения мибатиса
Вторичный кэш mybatis не подходит для мелкозернистого кэширования на уровне данных, например, для следующих требований: Кэшировать информацию о товарах из-за большого количества посещений информационных запросов о товарах, но требует, чтобы пользователи каждый раз запрашивали самую последнюю информацию о товарах. В настоящее время при использовании вторичного кэша mybatis невозможно обновить только кэшированную информацию о продукте без обновления информации о других продуктах при изменении продукта.Поскольку вторичная область кеша mybaits разделена картографом, при изменении информации о продукте данные кеша всей информации о продукте будут очищены.. Решение таких проблем требует целевого кэширования данных на бизнес-уровне в соответствии с требованиями.
Режим прокси картографа
Значение прокси-метода Mapper:Программистам нужно только написать интерфейс dao, а объект реализации интерфейса dao автоматически генерируется mybatis в качестве прокси-объекта.
После нескольких наших сообщений в блоге выше мы можем обнаружить, что наш DaoImpl очень повторяющийся...
1 В классе реализации dao есть повторяющийся код,Повторяется шаблон кода процесса всей операции mybatis (сначала создайте sqlsession, вызовите метод sqlsession, закройте sqlsession)
2. В классе реализации дао есть жесткое кодирование,Жестко закодируйте идентификатор оператора при вызове метода sqlsession.
РанееДублированный код и жестко запрограммированный следующим образом:
public class StudentDao {
public void add(Student student) throws Exception {
//得到连接对象
SqlSession sqlSession = MybatisUtil.getSqlSession();
try{
//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL
sqlSession.insert("StudentID.add", student);
sqlSession.commit();
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
Student student = new Student(3, "zhong3", 10000D);
studentDao.add(student);
}
}
Спецификация разработки картографа
Если вы хотите, чтобы Mybatis автоматически генерировал для нас прокси-сервер Mapper, нам необходимо следовать следующим спецификациям:
1,Пространство имен в mapper.xml указано как полное имя интерфейса сопоставления.
- Цель этого шага:Свяжите через mapper.xml и mapper.java.
2,Идентификатор оператора в mapper.xml — это имя метода в mapper.java.
3.Тип параметра оператора в mapper.xml совпадает с типом входного параметра метода в mapper.java.
4.Тип результата инструкции в mapper.xml совпадает с типом возвращаемого значения метода в mapper.java.
Снова:оператор — это идентификатор, который мы указали в пространстве имен + sql в файле mapper.xml.
Проблема с возвращаемым значением прокси Mapper
Возвращаемое значение метода интерфейса картографа:
- Если возвращается один объект, тип возвращаемого значения — тип pojo, а сгенерированный прокси-объект внутренне получает записи через selectOne.
- Если тип возвращаемого значения является объектом коллекции, сгенерированный прокси-объект внутренне получает записи через selectList.
Mybatis решает проблему программирования JDBC
1. Частое создание и освобождение ссылок на базу данных приводит к растрате системных ресурсов и влияет на производительность системы.Эту проблему можно решить, если использовать пул ссылок на базу данных.
- Решение. Настройте пул каналов передачи данных в файле SqlMapConfig.xml.Используйте пул соединений для управления связями с базой данных.
2. Оператор Sql написан в коде, что затрудняет поддержку кода.Фактическое применение sql может сильно измениться, и изменение sql должно изменить код java.
- решать:Настройте оператор Sql в файле XXXXmapper.xml так, чтобы он отделялся от кода Java..
3. Затруднительно передавать параметры в sql-оператор, потому что условия where sql-оператора не обязательно, их может быть больше или меньше, а заполнители должны соответствовать параметрам один за другим.
- решать:Mybatis автоматически сопоставляет объекты Java с операторами sql и определяет тип входных параметров через параметрType в операторе..
4. Затруднительно парсить результирующий набор.Изменение sql приводит к изменению кода парсинга, и его нужно пройти перед парсингом.Удобнее, если записи БД можно инкапсулировать в pojo объекты для парсинга.
- Решение: Mybatis автоматически сопоставляет результаты выполнения sql с объектами java,Определите тип выходного результата через resultType в операторе.
Реверс-инжиниринг Mybatis
По идее Intellij, обратный инжиниринг использования Mybatis без изучения Maven кажется немного сложным, а информации слишком мало... Найденная информация, похоже, не работает...
Итак, изучив Maven, я обновлю конфигурацию обратного проектирования, используя Mybatis в разделе Idea...
Из сообщения в блоге:blog.CSDN.net/Furu_no_life…
Измените файл pom.xml
Добавьте плагин обратного проектирования в этот проект.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>asdf</groupId>
<artifactId>asdf</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<finalName>zhongfucheng</finalName>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
Файл конфигурации generateConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--
<properties resource="conn.properties" />
-->
<!-- 处理1,这里的jar包位置可能需要修改 -->
<classPathEntry location="C:\mybatisMaven\lib\mysql-connector-java-5.1.7-bin.jar"/>
<!-- 指定运行环境是mybatis3的版本 -->
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否取消注释 -->
<property name="suppressAllComments" value="true" />
<!-- 是否生成注释代时间戳 -->
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- 处理2 jdbc 连接信息,看看库是否存在 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/scm?useUnicode=true&characterEncoding=UTF-8" userId="root" password="root">
</jdbcConnection>
<!--处理3 targetPackage指定模型在生成在哪个包 ,targetProject指定项目的src,-->
<javaModelGenerator targetPackage="zhongfucheng.entity"
targetProject="src/main/java">
<!-- 去除字段前后空格 -->
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!--处理4 配置SQL映射文件生成信息 -->
<sqlMapGenerator targetPackage="zhongfucheng.dao"
targetProject="src/main/java" />
<!-- 处理5 配置dao接口生成信息-->
<javaClientGenerator type="XMLMAPPER" targetPackage="zhongfucheng.dao" targetProject="src/main/java" />
<table tableName="account" domainObjectName="Account"/>
<table tableName="supplier" domainObjectName="Supplier"/>
</context>
</generatorConfiguration>
Используйте шаги плагина
Наконец сгенерируйте код
Если вам не ясна информация о пакете, настроенная в нашем генератореConfig.xml выше, вы можете взглянуть на нашу полную диаграмму структуры проекта...
Потому что нам не нужно писать соответствующее имя проекта в разделе «Идея», но в eclipse есть имя проекта.
Суммировать
-
Кэш первого уровня Mybatis находится на уровне sqlSession. Вы можете получить доступ к кешу только в своем собственном sqlSession. Если Mybatis интегрирован с Spring, Spring автоматически закроет sqlSession. Таким образом, кеш первого уровня будет недействителен.
-
Принцип кэша первого уровня — коллекция карт, и Mybatis по умолчанию поддерживает кэш первого уровня.
-
Кэш второго уровня находится на уровне Mapper. Кэш L2 можно использовать, пока он находится в пространстве имен Mapper. Нам нужно вручную настроить кеш второго уровня самостоятельно
-
Мы можем использовать структуру Ehcache для управления кешем Mybatis.Ehcache реализует интерфейс Cache, что означает использование Ehcache для окружения кеша Mybatis.
-
Потому что DaoImpl, написанный ранее, имеет много жесткого кода. Вы можете использовать прокси-метод Mapper для упрощения разработки
- Пространство имен должно совпадать с полным именем класса JavaBean.
- Идентификатор оператора фрагмента sql должен совпадать с именем метода интерфейса Dao.
- Параметр и возвращаемое значение метода должны совпадать с типом полученного параметра и типом возвращаемого значения фрагмента SQL.
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.