В предыдущей статье были представлены связанные концепции JDBC, разница между характеристиками MyBatis и Hibernate, основные компоненты и жизненный цикл MyBatis, и MyBatis можно в основном использовать.
Индекс статьи:
В этой статье подробно описывается конфигурация MyBatis. Сначала рассмотрим иерархическую структуру XML-файла конфигурации, а затем подробно представим каждый элемент конфигурации, объяснив функцию каждого элемента, значение и значение значения.
Иерархическая структура XML-файла конфигурации MyBatis приведена ниже. Порядок этих уровней не может быть изменен на противоположный.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties/>
<settings/>
<typeAliases/>
<typeHandles/>
<objectFactory/>
<plugins/>
<environments>
<environment>
<transanctionManager/> <!-- 配置事务管理器 -->
<dataSource/> <!-- 配置数据源 -->
</environment>
</environments>
<databaseIdProvider/> <!-- 数据库厂商标识 -->
<mappers/> <!-- 映射器 -->
</configuration>
элемент свойств
Объявляйте некоторые общие и часто изменяемые значения отдельно и используйте их в контексте файлов конфигурации.MyBatis предоставляет 3 метода настройки:
- дочерний элемент свойства
- файл конфигурации свойств
- Передача параметров программы
дочерний элемент свойства
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mi-user"/>
<property name="username" value="root"/>
<property name="pwd" value="123456"/>
</properties>
файл конфигурации свойств
Создайте файл конфигурации jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mi-user
username = root
password = 123456
Задать файл конфигурации свойств
<properties resource='jdbc.properties' />
Передача параметров программы
В реальной работе встречается такой сценарий: система настраивается эксплуатационным и обслуживающим персоналом, пароль формируемой базы данных держится в секрете от разработчика, а имя пользователя и пароль шифруются. Вы можете сначала расшифровать его, а затем установить свойство, передав параметры программы.
//读入配置文件流
InputStream cfgStream = Resources.getResourceAsStream("mybatis-config.xml");
Reader cfgReader = new InputStreamReader(cfgStream);
//读入属性文件流
InputStream proStream = Resources.getResourceAsStream("jdbc.properties");
Reader proReader = new InputStreamReader(proStream);
Properties properties = new Properties();
properties.load(proReader);
//转换为明文
properties.setProperty("username",decode(properties.getProperty("username")));
properties.setProperty("pwd",decode(properties.getProperty("pwd")));
//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(cfgReader,properties);
При одновременном появлении трех конфигураций приоритет имеет третья > вторая > первая, рекомендуется вторая, а третья используется при особых нуждах.
настраивать
Настройки изменят поведение среды выполнения MyBatis.Настроек много, и будут представлены только часто используемые конфигурации.Если вы хотите узнать все конфигурации, вы можете проверить официальную документацию.
- cacheEnabled, который глобально включает или отключает любой кеш, настроенный всеми картографами в файле конфигурации, значение по умолчанию — true;
- lazyLoadingEnabled, глобальный переключатель для отложенной загрузки. Если он включен, все связанные объекты будут загружаться отложенно. В определенных отношениях состояние переключателя элемента можно переопределить, установив свойство fetchType. Значение по умолчанию — false;
- агрессивныйLazyLoading, когда он включен, любой вызов метода будет загружать все свойства объекта. В противном случае каждое свойство будет загружаться по запросу, значение по умолчанию — true до версии 3.4.1, а значение по умолчанию — false после версии 3.4.1;
- autoMappingBehavior указывает, как MyBatis должен автоматически сопоставлять столбцы с полями или атрибутами, NONE означает отмену автоматического сопоставления, PARTIAL автоматически сопоставляет наборы результатов, которые не определяют сопоставление вложенных наборов результатов, FULL автоматически сопоставляет произвольно сложные наборы результатов, по умолчанию используется PARTIAL;
- autoMappingUnknownColumnBehavior, указывает поведение при обнаружении неизвестного столбца (или неизвестного типа атрибута) цели автоматического сопоставления, NONE: ничего не делать, WARNING: вывести журнал напоминаний, FAILING: не удалось сопоставить, значение по умолчанию — NONE;
- defaultStatementTimeout, который устанавливает время ожидания, определяющее количество секунд, в течение которых драйвер ожидает ответа от базы данных;
- mapUnderscoreToCamelCase, следует ли включить автоматическое сопоставление регистра верблюдов, то есть аналогичное сопоставление имени столбца классической базы данных A_COLUMN с именем классического свойства Java aColumn, значение по умолчанию — false;
- defaultEnumTypeHandler, указывает TypeHandler по умолчанию, используемый Enum, значение по умолчанию — org.apache.ibatis.type.EnumTypeHandler;
- returnInstanceForEmptyRow, MyBatis возвращает null по умолчанию, когда все столбцы возвращаемой строки пусты. Когда этот параметр включен, MyBatis вернет пустой экземпляр, значение по умолчанию — false;
- localCacheScope, MyBatis использует механизм локального кэша (Local Cache) для предотвращения циклических ссылок и ускорения повторяющихся вложенных запросов. По умолчанию используется SESSION, и в этом случае все запросы, выполненные в сеансе, кэшируются. Если задано значение STATEMENT, локальный сеанс используется только для выполнения инструкции, а разные вызовы одного и того же SqlSession не будут совместно использовать данные, значение по умолчанию — SESSION;
- logImpl указывает конкретную реализацию журнала, такую как SLF4J|LOG4J|COMMONS_LOGGING и т. д.;
псевдоним
В файле сопоставления конфигурации необходимо указать полное имя класса.Для простоты можно объявить короткое имя для ссылки на него, которое можно использовать в контексте MyBatis. Система определила для нас общие типы, такие как числовые значения, строки, даты, наборы и т. д. Для настраиваемых бизнес-объектов POJO требуются настраиваемые псевдонимы.
<typeAliases>
<typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
</typeAliases>
Это также можно сделать с помощью аннотации: сначала настроить отсканированный пакет, а затем добавить аннотацию @Alias("роль") к определению класса.
<typeAliases>
<package name="com.learn.chapter2.po" />
</typeAliases>
@Alias("role")
public class Role{
}
обработчик типа
Когда MyBatis устанавливает параметр в подготовленном операторе или берет значение из набора результатов, он будет использовать для обработки зарегистрированный typeHader. Роль typeHander заключается в преобразовании параметров из javaType в jdbcType или преобразовании jdbcType в javaType при извлечении результата из базы данных.
В системе определены часто используемые процессоры типов, и в некоторых случаях требуется настройка.
MyBatis также предоставляет обработчики типов для типов перечисления.Существует 2 обработчика типов, которые преобразуют типы перечисления, EnumTypeHandler и EnumOrdinalTypeHandler, где EnumTypeHandler передается с использованием имени строки перечисления в качестве параметра, а EnumOrdinalTypeHandler передается с использованием целочисленного нижнего индекса в качестве параметра.
Однако эти два типа перечислений не так широко используются, и чаще всего для обработки требуются пользовательские обработчики типов.
Чтобы настроить обработчик типа, сначала определите класс обработчика типа и реализуйте универсальный интерфейс TypeHandler:
public class SexEnumTypeHandler implements TypeHandler<Sex> {
@Override
public void setParameter(PreparedStatement ps, int i, Sex sex, JdbcType jdbcType) throws SQLException {
ps.setInt(i, sex.getId());
}
@Override
public Sex getResult(ResultSet rs, String name) throws SQLException {
return Sex.getSex(rs.getInt(name));
}
@Override
public Sex getResult(ResultSet rs, int id) throws SQLException {
return Sex.getSex(id);
}
@Override
public Sex getResult(CallableStatement cs, int id) throws SQLException {
return Sex.getSex(cs.getInt(id));
}
}
Затем зарегистрируйте собственный TypeHandler
<typeHandlers>
<typeHandler handler="com.qqdong.study.SexEnumTypeHandler" javaType="sex"/>
</typeHandlers>
Наконец, при определении маппера укажите typeHandler
<select id="getUser" parameterType="long" resultType="userMap">
</select>
<resultMap id="userMap" type="user">
<result column="sex" property="sex" typeHandler="com.qqdong.study.SexEnumTypeHandler">
</resultMap>
ObjectFactory
Когда MyBatis создаст результат и вернется, он будет использовать ObjectFactory для создания POJO, а MyBatis может настроить свою собственную фабрику объектов. Как правило, никакой настройки не требуется, просто используйте DefaultObjectFactory по умолчанию.
плагин плагин
Плагин более сложен и будет представлен в отдельной статье позже.
средаконфигурация среды
Среда конфигурации может регистрировать несколько источников данных, и каждый источник данных включает в себя базовую конфигурацию и конфигурацию транзакций базы данных.
<environments default="development">
<environment id="development">
<!-- 采用jdbc事务管理 -->
<transactionManager type="JDBC">
<property name="autoCommit" value="false">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
Среди них transactionManager определяет транзакции базы данных, и есть 3 метода настройки:
- JDBC, использующий JDBC для управления транзакциями, часто используется в независимом кодировании;
- MANAGED, который управляет транзакциями в контейнерном режиме, обычно используется в источниках данных JNDI;
- Пользовательские, определяемые пользователем методы управления транзакциями базы данных;
Тег dataSource настраивает информацию о подключении к источнику данных, а тип настраивает метод подключения к базе данных.Существуют следующие типы:
- UNPOOLED: база данных пула без соединений;
- POOLED: база данных пула соединений;
- JNDI: источник данных JNDI;
- пользовательский источник данных;
Идентификатор поставщика базы данных databaseIdProvider
Функция этого свойства — указать SQL для запуска в базе данных, предоставленной соответствующим поставщиком базы данных. Он не используется повсеместно и не будет представлен.
картограф
Mapper — это самая сложная и основная конфигурация MyBatis, включая типы параметров, динамический SQL, определенный SQL, кэшированную информацию и другие функции.В предыдущей статье также были продемонстрированы конкретные примеры, а следующая статья будет посвящена деталям.
Добро пожаловать, чтобы отсканировать QR-код ниже и подписаться на мою личную общедоступную учетную запись WeChat ~