TypeHandler — это интерфейс в MyBatis, используемый для преобразования типов Java в типы JDBC. Во время выполнения инструкции SQL, будь то установка параметров или получение набора результатов, преобразование типов должно выполняться через TypeHandler. MyBatis предоставляет богатые встроенные реализации TypeHandler для поддержки преобразований общих типов данных. В то же время вы также можете настроить TypeHandler по мере необходимости для обработки специальных типов данных или логики преобразования.
TypeHandler — это основная концепция MyBatis, и ее принцип работы в основном включает преобразование между типами Java и типами JDBC. Принцип работы TypeHandler будет подробно описан ниже.
Когда MyBatis выполняет предварительно скомпилированный оператор SQL (например, INSERT, UPDATE и т. д.), ему необходимо установить значение свойства в объекте Java в соответствующий заполнитель в операторе SQL. Этот процесс реализуется через TypeHandler.
Конкретные шаги заключаются в следующем:
Когда база данных выполняет операцию запроса и возвращает набор результатов, MyBatis необходимо извлечь данные из набора результатов и преобразовать их в соответствующий тип атрибута в объекте Java. Этот процесс также реализуется через TypeHandler.
Конкретные шаги заключаются в следующем:
Основная функция TypeHandler — реализация сопоставления и преобразования между типами Java и типами JDBC. Эти правила сопоставления и преобразования определяются на основе характеристик и семантики типов Java и типов JDBC.
Механизм TypeHandler MyBatis обладает высокой масштабируемостью. Разработчики могут создавать собственные реализации TypeHandler, реализуя интерфейс TypeHandler или наследуя класс BaseTypeHandler. Настраиваемый TypeHandler может реализовать сколь угодно сложную логику преобразования типов для удовлетворения конкретных потребностей бизнеса.
Кроме того, MyBatis также предоставляет множество API-интерфейсов и точек расширения, которые помогают разработчикам настраивать регистрацию и использование TypeHandler. Разработчики могут зарегистрировать собственные TypeHandlers в MyBatis с помощью файлов конфигурации, аннотаций или программным способом и ссылаться на них в файлах сопоставления XML Mapper для обработки конкретных требований к преобразованию типов данных.
Чтобы упростить работу разработчиков, MyBatis предоставляет ряд встроенных TypeHandlers, которые могут обрабатывать наиболее распространенные преобразования типов данных. Ниже приведены некоторые распространенные встроенные обработчики типов в MyBatis:
Boolean
введите сбаза данныхсерединаизBOOLEAN
、BIT
ждатьтипиз Отображение отношений。Integer
、Long
、Short
ждатьцелое числовведите сбаза данныхсерединаиз相应целое числотипизкартографирование,нравитьсяINT
、BIGINT
、SMALLINT
ждать。Float
、Double
иBigDecimal
,ибаза данныхсерединаизFLOAT
、DOUBLE
、DECIMAL
ждатьтипизкартографирование。String
введите сбаза данныхсерединаизхарактертипнравитьсяVARCHAR
、CHAR
、TEXT
ждатьиз Отображение отношений。Date
、Time
、Timestamp
,ибаза данныхсерединаизDATE
、TIME
、TIMESTAMP
ждатьтипизкартографирование。byte[]
введите сбаза данныхсерединаиздвоичныйтипизкартографирование,нравитьсяBLOB
、BINARY
ждать。Clob
(персонаж, большой предмет)иBlob
(большой двоичный объект)введите сбаза данныхсерединаизCLOB
иBLOB
типизкартографирование。EnumTypeHandler
Сохраните имя перечисления вбаза данных,иEnumOrdinalTypeHandler
Воляперечислятьизпорядковый номер(ordinal)хранить вбаза данных。java.sql.Types
серединаизпостоянный)чтобы определить конкретныеизтипиметь дело с Способ。Выше приведены лишь некоторые примеры встроенного TypeHandler в MyBatis. Фактически MyBatis предоставляет больше встроенного TypeHandler для поддержки различных типов преобразования данных. При использовании MyBatis вы можете выбрать соответствующий встроенный TypeHandler в соответствии с конкретным типом базы данных и типом Java или настроить TypeHandler по мере необходимости для обработки особых сценариев преобразования типов данных.
В некоторых случаях нам может потребоваться обработка некоторых специальных типов данных или реализация сложной логики преобразования типов. На данный момент вам необходимо настроить TypeHandler. Ниже приведены шаги по настройке TypeHandler в среде Spring Boot:
Пользовательский TypeHandler должен реализовать интерфейс org.apache.ibatis.type.TypeHandler или наследовать класс org.apache.ibatis.type.BaseTypeHandler и переопределить соответствующие методы.
org.apache.ibatis.type.TypeHandler
TypeHandler — это интерфейс, который определяет, как обрабатывать преобразования между типами JDBC и типами Java. Когда вам нужно создать обработчик пользовательского типа, вам обычно необходимо реализовать этот интерфейс. Этот интерфейс определяет следующие основные методы:
setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
:для установкиPreparedStatementобъектиз Укажите параметры。getResult(ResultSet rs, String columnName)
:из набора результатовсередина Получить данные на основе имени столбца。getResult(ResultSet rs, int columnIndex)
:из набора результатовсередина Получить данные на основе индекса столбца。getResult(CallableStatement cs, int columnIndex)
:из хранимой процедурыизнабор результатовсередина Получить данные на основе индекса столбца。Эти методы соответственно отвечают за преобразование параметров типа Java в типы JDBC при выполнении операторов SQL и преобразование результатов типа JDBC в типы Java после выполнения запросов SQL.
org.apache.ibatis.type.BaseTypeHandler
BaseTypeHandlerдаTypeHandler
интерфейсизабстрактная реализациядобрый,Он предоставляет некоторые базовые реализации,Это позволяет переопределить только необходимые методы при создании обработчика пользовательского типа. в целом,Если вам не нужно обрабатывать все типы JDBC,Вы можете выбрать наследованиеBaseTypeHandler
чтобы уменьшить рабочую нагрузку。
BaseTypeHandler
предусмотреноnull
ценитьизиметь дело си частьTypeHandler
интерфейс方法из Реализация по умолчанию。когда ты унаследуешьBaseTypeHandler
час,Обычно вам необходимо реализовать или переопределить следующие методы:
setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
:Установить ненулевое значениеиз参数ценить。getNullableResult(ResultSet rs, String columnName)
:Получение на основе имени столбца может бытьnullизрезультат。getNullableResult(ResultSet rs, int columnIndex)
:Получение на основе индекса столбца может бытьnullизрезультат。getNullableResult(CallableStatement cs, int columnIndex)
:из хранимой процедурыизнабор результатовсередина Получение на основе индекса столбца может бытьnullизрезультат。Эти методы ориентированы на обработку преобразований ненулевых значений и обработку потенциально нулевых значений, полученных из базы данных.
в общем,TypeHandler
интерфейс提供了完整изJDBCтипиJavaтип Конвертироватьиздоговор,иBaseTypeHandler
нодаудобствоизбазадобрый,Предоставляет некоторые базовые и общие реализации.,Для уменьшения количества кода при настройке процессоров типов. При создании процессора нестандартного типа,Вы можете реализовать его непосредственно в соответствии с конкретными потребностями.TypeHandler
интерфейс还данаследоватьBaseTypeHandler
добрый。
Зарегистрируйте собственный TypeHandler в файле конфигурации MyBatis. Если это весна BootсредасерединаиспользоватьMyBatis,Доступен черезapplication.properties
илиapplication.yml
документсередина Конфигурацияmybatis.type-handlers-package
атрибуты для указанияTypeHandlerМестосуществоватьизпуть к пакету,MyBatis автоматически просканирует и зарегистрирует все TypeHandlers в этом пакете.
В XML-файле сопоставления Mapper,проходитьresultType
илиparameterType
Настройка ссылки на свойствоизTypeHandler。примернравиться,существовать<select>
ЭтикеткасерединанастраиватьresultType="com.example.CustomType"
Приходитьобозначениеиспользовать自定义изTypeHandlerиметь дело с查询результат。
первый,Создайте индивидуальныйизTypeHandler
Приходитьиметь дело сLocalDateTime
введите сбаза Преобразование между типами временных меток в данных.
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
@MappedJdbcTypes(JdbcType.TIMESTAMP) // Укажите соответствующий тип JDBC.
@MappedTypes(LocalDateTime.class) // Укажите соответствующий тип Java
public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
ps.setTimestamp(i, java.sql.Timestamp.valueOf(parameter));
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
java.sql.Timestamp timestamp = rs.getTimestamp(columnName);
return timestamp != null ? timestamp.toLocalDateTime() : null;
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
java.sql.Timestamp timestamp = rs.getTimestamp(columnIndex);
return timestamp != null ? timestamp.toLocalDateTime() : null;
}
@Override
public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
java.sql.Timestamp timestamp = cs.getTimestamp(columnIndex);
return timestamp != null ? timestamp.toLocalDateTime() : null;
}
}
Тогда весной Bootиз Конфигурациясередина,тебе нужно убедитьсяMyBatisМогу отсканировать этоTypeHandler
。в целом,MyBatisБудет сканироваться автоматическииMapperинтерфейс相同изпуть к пакету下изTypeHandler
。нода,нравиться Если вы хотите указать более явноTypeHandler
из Расположение,Вы можете сделать это через файл конфигурации MyBatis.
существоватьsrc/main/resources
Создать в каталогеMyBatisиз Конфигурациядокументmybatis-config.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeHandlers>
<package name="com.example.demo.typehandler"/> <!-- Укажите имя пакета TypeHandler. -->
</typeHandlers>
</configuration>
существоватьapplication.properties
илиapplication.yml
серединаобозначениеMyBatisКонфигурациядокументиз Расположение:
# application.properties
mybatis.config-location=classpath:mybatis-config.xml
убедитесь, что выизMapperВ интерфейсе используетсяLocalDateTime
типиз Поле,а тыизбаза В таблице данных есть соответствующее поле временной метки.
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
@Mapper
public interface ExampleMapper {
@Select("SELECT * FROM example_table")
List<ExampleEntity> selectAll();
// Другие операции CRUD...
}
// Соответствующий класс сущности
public class ExampleEntity {
private Long id;
private LocalDateTime createdAt;
// Опустить метод getter и setter...
}
Наконец весной Bootиззапускатьдобрыйили Конфигурациядобрый上использовать@MapperScan
комментировать Укажите имя пакета, в котором расположен интерфейс Mapper.:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // Укажите имя пакета, в котором расположен интерфейс Mapper.
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Убедитесь, что ваша весна Проект Boot содержит MyBatis и MyBatis. Spring Boot Starterиз Зависимости。ты можешьсуществоватьpom.xml
серединадобавить внравитьсязависимость:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version> <!-- Используйте версию, подходящую для вашего проекта. -->
</dependency>
Теперь, когда вы запускаете Spring Bootприложениечас,MyBatisВоля会использовать你自定义изLocalDateTimeTypeHandler
Приходитьиметь дело сLocalDateTime
введите сбаза данныхсерединаизTIMESTAMP
типмеждуиз Конвертировать。Уведомление,Поскольку мы использовали@MappedJdbcTypes
и@MappedTypes
аннотация,MyBatisавтоматически распознает и будет использовать этоTypeHandler
。нравитьсяесли у тебя нетсуществоватьTypeHandler
上использовать Этианнотация,вам нужносуществоватьMyBatisКонфигурациядокументсередина Явная регистрацияTypeHandler
。
Чтобы зарегистрировать собственный TypeHandler в MyBatis, обычно есть два метода:
Сценарии применения пользовательского TypeHandler очень широки. Вот некоторые распространенные сценарии применения:
Механизм TypeHandler MyBatis обеспечивает гибкую и мощную поддержку преобразования между типами Java и типами JDBC. Благодаря встроенному и настраиваемому TypeHandler мы можем легко справиться с различными потребностями в преобразовании типов данных, повышая эффективность разработки и удобство сопровождения кода. Использование специального TypeHandler в среде Spring Boot упрощает процесс настройки и регистрации, позволяя разработчикам больше сосредоточиться на реализации бизнес-логики.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
Код на тридцать пять
』 , для получения дополнительной технической информации.