Подробное объяснение MyBatis TypeHandler: принципы и методы настройки.
Подробное объяснение MyBatis TypeHandler: принципы и методы настройки.

1. Введение в TypeHandler

TypeHandler — это интерфейс в MyBatis, используемый для преобразования типов Java в типы JDBC. Во время выполнения инструкции SQL, будь то установка параметров или получение набора результатов, преобразование типов должно выполняться через TypeHandler. MyBatis предоставляет богатые встроенные реализации TypeHandler для поддержки преобразований общих типов данных. В то же время вы также можете настроить TypeHandler по мере необходимости для обработки специальных типов данных или логики преобразования.

2. Принцип работы TypeHandler

TypeHandler — это основная концепция MyBatis, и ее принцип работы в основном включает преобразование между типами Java и типами JDBC. Принцип работы TypeHandler будет подробно описан ниже.

1. Настройка параметров

Когда MyBatis выполняет предварительно скомпилированный оператор SQL (например, INSERT, UPDATE и т. д.), ему необходимо установить значение свойства в объекте Java в соответствующий заполнитель в операторе SQL. Этот процесс реализуется через TypeHandler.

Конкретные шаги заключаются в следующем:

  • MyBatis найдет соответствующий экземпляр TypeHandler на основе конфигурации сопоставления. Эту конфигурацию сопоставления можно определить в файле конфигурации MyBatis или XML-файле Mapper.
  • Экземпляр TypeHandler получает значение свойства в объекте Java и преобразует его в тип, распознаваемый JDBC. Этот процесс преобразования реализуется на основе отношений сопоставления между типами Java и типами JDBC.
  • Преобразованному значению будет присвоен соответствующий заполнитель в объекте ReadedStatement, чтобы база данные могут правильно анализировать и выполнять операторы SQL.
2. Получение результата

Когда база данных выполняет операцию запроса и возвращает набор результатов, MyBatis необходимо извлечь данные из набора результатов и преобразовать их в соответствующий тип атрибута в объекте Java. Этот процесс также реализуется через TypeHandler.

Конкретные шаги заключаются в следующем:

  • MyBatis найдет соответствующий экземпляр TypeHandler на основе конфигурации сопоставления.
  • Экземпляр TypeHandler будет извлекать данные из объекта ResultSet. Этот процесс извлечения реализуется на основе отношений сопоставления между полями базы данных и свойствами Java.
  • Извлеченные данные будут преобразованы в соответствующий тип свойства объекта Java. Этот процесс преобразования также реализован на основе отношений сопоставления между типами Java и типами JDBC.
  • Преобразованному значению будет присвоено соответствующее свойство объекта Java, чтобы приложение могло правильно обрабатывать и использовать данные.
3. Правила сопоставления типов и преобразования

Основная функция TypeHandler — реализация сопоставления и преобразования между типами Java и типами JDBC. Эти правила сопоставления и преобразования определяются на основе характеристик и семантики типов Java и типов JDBC.

  • Для базовых типов данных (таких как int, long, float и т. д.) MyBatis предоставляет встроенные реализации TypeHandler, которые могут напрямую преобразовывать базовые типы данных Java в соответствующие базовые типы данных JDBC и наоборот.
  • Для сложных типов данных (таких как пользовательские объекты, коллекции и т. д.),MyBatis позволяет разработчикам настраивать TypeHandler для реализации сложной логики преобразования типов. Например,Разработчики могут определить собственный TypeHandler для преобразования базы. Преобразование строки JSON в данных в объект Java или преобразование объекта Java в строку JSON для хранения в базе. данныхсередина。
4. Расширяемость пользовательского TypeHandler

Механизм TypeHandler MyBatis обладает высокой масштабируемостью. Разработчики могут создавать собственные реализации TypeHandler, реализуя интерфейс TypeHandler или наследуя класс BaseTypeHandler. Настраиваемый TypeHandler может реализовать сколь угодно сложную логику преобразования типов для удовлетворения конкретных потребностей бизнеса.

Кроме того, MyBatis также предоставляет множество API-интерфейсов и точек расширения, которые помогают разработчикам настраивать регистрацию и использование TypeHandler. Разработчики могут зарегистрировать собственные TypeHandlers в MyBatis с помощью файлов конфигурации, аннотаций или программным способом и ссылаться на них в файлах сопоставления XML Mapper для обработки конкретных требований к преобразованию типов данных.

3. Знакомство со встроенным TypeHandler

Чтобы упростить работу разработчиков, MyBatis предоставляет ряд встроенных TypeHandlers, которые могут обрабатывать наиболее распространенные преобразования типов данных. Ниже приведены некоторые распространенные встроенные обработчики типов в MyBatis:

  1. BooleanTypeHandler: иметь дело сJavaизBooleanвведите сбаза данныхсерединаизBOOLEANBITждатьтипиз Отображение отношений。
  2. IntegerTypeHandlerLongTypeHandlerShortTypeHandler ждать: ЭтиTypeHandlerсоответственноиметь дело сJavaсерединаизIntegerLongShortждатьцелое числовведите сбаза данныхсерединаиз相应целое числотипизкартографирование,нравитьсяINTBIGINTSMALLINTждать。
  3. FloatTypeHandlerDoubleTypeHandlerBigDecimalTypeHandler: иметь дело сJavaсерединаизчисло с плавающей запятойи Тип фиксированной точки,нравитьсяFloatDoubleиBigDecimal,ибаза данныхсерединаизFLOATDOUBLEDECIMALждатьтипизкартографирование。
  4. StringTypeHandler: иметь дело сJavaизStringвведите сбаза данныхсерединаизхарактертипнравитьсяVARCHARCHARTEXTждатьиз Отображение отношений。
  5. DateTypeHandlerTimeTypeHandlerTimestampTypeHandler: ЭтиTypeHandlerиметь дело сJavaсерединаиздатаитип времени,нравитьсяDateTimeTimestamp,ибаза данныхсерединаизDATETIMETIMESTAMPждатьтипизкартографирование。
  6. ByteArrayTypeHandler: иметь дело сJavaизbyte[]введите сбаза данныхсерединаиздвоичныйтипизкартографирование,нравитьсяBLOBBINARYждать。
  7. ClobTypeHandler и BlobTypeHandler: соответственноиметь дело сJavaсерединаизClob(персонаж, большой предмет)иBlob(большой двоичный объект)введите сбаза данныхсерединаизCLOBиBLOBтипизкартографирование。
  8. EnumTypeHandler и EnumOrdinalTypeHandler: эти двоеTypeHandlerиспользуется дляиметь дело сJavaсерединаизперечислятьтип。EnumTypeHandlerСохраните имя перечисления вбаза данных,иEnumOrdinalTypeHandlerВоляперечислятьизпорядковый номер(ordinal)хранить вбаза данных。
  9. JdbcTypeHandler: этотдагенерализTypeHandler,это основано наJDBCтип(java.sql.Typesсерединаизпостоянный)чтобы определить конкретныеизтипиметь дело с Способ。
  10. UnknownTypeHandler: Этот TypeHandler будет использоваться, когда MyBatis не может определить конкретный метод обработки типа. Обычно это последнее средство и попытка обработать значение как объект.

Выше приведены лишь некоторые примеры встроенного TypeHandler в MyBatis. Фактически MyBatis предоставляет больше встроенного TypeHandler для поддержки различных типов преобразования данных. При использовании MyBatis вы можете выбрать соответствующий встроенный TypeHandler в соответствии с конкретным типом базы данных и типом Java или настроить TypeHandler по мере необходимости для обработки особых сценариев преобразования типов данных.

4. Индивидуальная практика TypeHandler

В некоторых случаях нам может потребоваться обработка некоторых специальных типов данных или реализация сложной логики преобразования типов. На данный момент вам необходимо настроить TypeHandler. Ниже приведены шаги по настройке TypeHandler в среде Spring Boot:

1. Создайте собственный класс TypeHandler.

Пользовательский TypeHandler должен реализовать интерфейс org.apache.ibatis.type.TypeHandler или наследовать класс org.apache.ibatis.type.BaseTypeHandler и переопределить соответствующие методы.

org.apache.ibatis.type.TypeHandler

TypeHandler — это интерфейс, который определяет, как обрабатывать преобразования между типами JDBC и типами Java. Когда вам нужно создать обработчик пользовательского типа, вам обычно необходимо реализовать этот интерфейс. Этот интерфейс определяет следующие основные методы:

  1. setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):для установкиPreparedStatementобъектиз Укажите параметры。
  2. getResult(ResultSet rs, String columnName):из набора результатовсередина Получить данные на основе имени столбца。
  3. getResult(ResultSet rs, int columnIndex):из набора результатовсередина Получить данные на основе индекса столбца。
  4. getResult(CallableStatement cs, int columnIndex):из хранимой процедурыизнабор результатовсередина Получить данные на основе индекса столбца。

Эти методы соответственно отвечают за преобразование параметров типа Java в типы JDBC при выполнении операторов SQL и преобразование результатов типа JDBC в типы Java после выполнения запросов SQL.

org.apache.ibatis.type.BaseTypeHandler

BaseTypeHandlerдаTypeHandlerинтерфейсизабстрактная реализациядобрый,Он предоставляет некоторые базовые реализации,Это позволяет переопределить только необходимые методы при создании обработчика пользовательского типа. в целом,Если вам не нужно обрабатывать все типы JDBC,Вы можете выбрать наследованиеBaseTypeHandlerчтобы уменьшить рабочую нагрузку。

BaseTypeHandler предусмотреноnullценитьизиметь дело си частьTypeHandlerинтерфейс方法из Реализация по умолчанию。когда ты унаследуешьBaseTypeHandlerчас,Обычно вам необходимо реализовать или переопределить следующие методы:

  1. setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):Установить ненулевое значениеиз参数ценить。
  2. getNullableResult(ResultSet rs, String columnName):Получение на основе имени столбца может бытьnullизрезультат。
  3. getNullableResult(ResultSet rs, int columnIndex):Получение на основе индекса столбца может бытьnullизрезультат。
  4. getNullableResult(CallableStatement cs, int columnIndex):из хранимой процедурыизнабор результатовсередина Получение на основе индекса столбца может бытьnullизрезультат。

Эти методы ориентированы на обработку преобразований ненулевых значений и обработку потенциально нулевых значений, полученных из базы данных.

в общем,TypeHandlerинтерфейс提供了完整изJDBCтипиJavaтип Конвертироватьиздоговор,иBaseTypeHandlerнодаудобствоизбазадобрый,Предоставляет некоторые базовые и общие реализации.,Для уменьшения количества кода при настройке процессоров типов. При создании процессора нестандартного типа,Вы можете реализовать его непосредственно в соответствии с конкретными потребностями.TypeHandlerинтерфейс还данаследоватьBaseTypeHandlerдобрый。

2. Зарегистрируйте собственный TypeHandler.

Зарегистрируйте собственный TypeHandler в файле конфигурации MyBatis. Если это весна BootсредасерединаиспользоватьMyBatis,Доступен черезapplication.propertiesилиapplication.ymlдокументсередина Конфигурацияmybatis.type-handlers-packageатрибуты для указанияTypeHandlerМестосуществоватьизпуть к пакету,MyBatis автоматически просканирует и зарегистрирует все TypeHandlers в этом пакете.

3. Используйте собственный TypeHandler в Mapper.

В XML-файле сопоставления Mapper,проходитьresultTypeилиparameterTypeНастройка ссылки на свойствоизTypeHandler。примернравиться,существовать<select>ЭтикеткасерединанастраиватьresultType="com.example.CustomType"Приходитьобозначениеиспользовать自定义изTypeHandlerиметь дело с查询результат。

Пользовательский случай преобразования времени

первый,Создайте индивидуальныйизTypeHandlerПриходитьиметь дело сLocalDateTimeвведите сбаза Преобразование между типами временных меток в данных.

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
<?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Конфигурациядокументиз Расположение:

Язык кода:javascript
копировать
# application.properties
mybatis.config-location=classpath:mybatis-config.xml

убедитесь, что выизMapperВ интерфейсе используетсяLocalDateTimeтипиз Поле,а тыизбаза В таблице данных есть соответствующее поле временной метки.

Язык кода:javascript
копировать
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.:

Язык кода:javascript
копировать
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серединадобавить внравитьсязависимость:

Язык кода:javascript
копировать
<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, обычно есть два метода:

  1. Используйте аннотации: используйте аннотации @MappedJdbcTypes и @MappedTypes непосредственно в классе TypeHandler. Этот подход продемонстрирован в примере, который вы уже использовали. Когда MyBatis сканирует TypeHandler с этими аннотациями,Он будет автоматически зарегистрирован.
  2. Зарегистрируйтесь в файле конфигурации MyBatis. Если вы не используете аннотации или хотите зарегистрировать TypeHandler более явно, вы можете вручную добавить его в файл конфигурации MyBatis.

5. Сценарии применения

Сценарии применения пользовательского TypeHandler очень широки. Вот некоторые распространенные сценарии применения:

  1. Обработка типов перечисления:Волябаза Сопоставьте целочисленные значения в данных с типами перечисления в Java или преобразуйте типы перечисления в базу. Целочисленное значение в данных.
  2. Обработка сложных типов данных:нравиться Волябаза Сопоставьте строки JSON в данных с объектами Java или преобразуйте объекты Java в строки JSON и сохраните их в базе. данныхсередина。
  3. Реализуйте специальную логику преобразования типов.:нравиться Волябаза Преобразование строки даты в данных в определенный формат объекта даты в Java.
  4. Совместимость с различными типами баз данных:当использовать不同типизбаза данных, может потребоваться обработка различий в преобразовании между разными типами. базы можно достичь путем настройки TypeHandler Совместимое преобразование между типами данных.

6. Резюме

Механизм TypeHandler MyBatis обеспечивает гибкую и мощную поддержку преобразования между типами Java и типами JDBC. Благодаря встроенному и настраиваемому TypeHandler мы можем легко справиться с различными потребностями в преобразовании типов данных, повышая эффективность разработки и удобство сопровождения кода. Использование специального TypeHandler в среде Spring Boot упрощает процесс настройки и регистрации, позволяя разработчикам больше сосредоточиться на реализации бизнес-логики.


Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт Код на тридцать пять , для получения дополнительной технической информации.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose