MyBatis 类型处理器TypeHandler作用

一文搞懂MyBatis中的TypeHandler 本文介绍了MyBatis中的TypeHandler机制,用于处理Java类型与数据库类型之间的转换。TypeHandler是MyBatis的核心组件,在执行SQL操作时自动完成数据类型转换,包括将Java对象转换为数据库可识别类型(如设置参数时)和将数据库结果转换为Java对象(如结果映射时)。文章详细阐述了TypeHandler的工作原理,并介绍了通过继承BaseTypeHandler抽象类实现自定义类型处理器的方法,只需重写关键方法即可完成特定数据类型的转换。MyBatis内置了多种常用TypeHand 阅读详情

TypeHandler 是 MyBatis 中用于处理 Java 类型与 JDBC 类型之间转换的接口。它在 MyBatis 的参数绑定和结果映射过程中起着至关重要的作用。

为什么需要 TypeHandler?

Java 和 数据库(JDBC)使用不同的类型系统。例如:

  • Java 中有 String、Integer、Date、Boolean、enum 等类型。
  • JDBC 中有 VARCHAR、INTEGER、DATE、BOOLEAN、TIMESTAMP、BLOB 等类型。

当 MyBatis 执行 SQL 语句时,需要将 Java 对象中的数据设置到 JDBC 的 PreparedStatement 中(参数绑定),以及将 JDBC 的 ResultSet 中的数据转换为 Java 对象(结果映射)。TypeHandler 就负责处理这两种情况下的类型转换。

TypeHandler 的作用:

  1. 参数绑定 (Java 类型 -> JDBC 类型):

    • 当 MyBatis 将 Java 对象中的数据设置到 PreparedStatement 的占位符(#{})时,TypeHandler 会将 Java 类型转换为对应的 JDBC 类型。
    • 例如,将 Java 的 String 类型转换为 JDBC 的 VARCHAR 类型,将 Java 的 Date 类型转换为 JDBC 的 TIMESTAMP 类型。
  2. 结果映射 (JDBC 类型 -> Java 类型):

    • 当 MyBatis 从 ResultSet 中读取数据并将其映射为 Java 对象时,TypeHandler 会将 JDBC 类型转换为对应的 Java 类型。
    • 例如,将 JDBC 的 VARCHAR 类型转换为 Java 的 String 类型,将 JDBC 的 INTEGER 类型转换为 Java 的 Integer 类型。

TypeHandler 的接口定义:

public interface TypeHandler<T> {

  // 参数绑定:将 Java 类型转换为 JDBC 类型,并设置到 PreparedStatement 中
  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  // 结果映射:从 ResultSet 中获取指定列的数据,并将其转换为 Java 类型
  T getResult(ResultSet rs, String columnName) throws SQLException;

  // 结果映射:从 ResultSet 中获取指定列索引的数据,并将其转换为 Java 类型
  T getResult(ResultSet rs, int columnIndex) throws SQLException;
  
    // 结果映射:从 CallableStatement 中获取指定列索引的数据,将其转换为java类型
  T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
  • setParameter(): 将 Java 类型的参数 parameter 设置到 PreparedStatement 的第 i 个占位符,并指定 JDBC 类型 jdbcType(jdbcType 可以为空,MyBatis 会尝试自动推断)。
  • getResult(): 有三个重载方法,分别根据列名、列索引从 ResultSet 中获取数据,或从CallableStatement获取数据,并将其转换为 Java 类型。

MyBatis 内置的 TypeHandler:

MyBatis 内置了许多常用的 TypeHandler,用于处理常见的类型转换。例如:

  • StringTypeHandler: 处理 String 类型。
  • IntegerTypeHandler: 处理 Integer 类型。
  • LongTypeHandler: 处理 Long 类型。
  • DateTypeHandler: 处理 java.util.Date 类型。
  • BooleanTypeHandler: 处理 Boolean 类型。
  • EnumTypeHandler: 处理枚举类型(默认使用枚举的名称)。
  • EnumOrdinalTypeHandler: 处理枚举类型(使用枚举的序数)。
  • BlobTypeHandler: 处理二进制大对象 (BLOB)。
  • ClobTypeHandler: 处理字符大对象 (CLOB)。
  • SqlDateTypeHandler:处理java.sql.Date类型
  • SqlTimeTypeHandler:处理java.sql.Time类型
  • SqlTimestampTypeHandler:处理java.sql.Timestamp类型
  • …

自定义 TypeHandler:

当 MyBatis 内置的 TypeHandler 不能满足需求时,我们可以自定义 TypeHandler。例如:

  1. 处理特殊类型: 例如,将数据库中的 JSON 字符串转换为 Java 对象,或者将 Java 对象转换为 JSON 字符串存储到数据库中。
  2. 自定义类型转换逻辑: 例如,对日期类型进行特殊的格式化,或者对枚举类型使用自定义的转换规则。

自定义 TypeHandler 的步骤:

  1. 实现 TypeHandler 接口: 创建一个类,实现 TypeHandler 接口,并实现接口中的方法。
  2. 注册 TypeHandler: 有两种方式注册自定义的 TypeHandler:
    • XML 配置: 在 mybatis-config.xml 文件中,使用 <typeHandlers> 标签注册 TypeHandler。

      <typeHandlers>
        <typeHandler handler="com.example.MyTypeHandler" javaType="com.example.MyType" jdbcType="VARCHAR"/>
      </typeHandlers>
      

      或者使用包扫描:

       <typeHandlers>
           <package name="com.example.typehandler"/>
       </typeHandlers>
      
    • 注解配置: 在自定义的 TypeHandler 类上使用 @MappedTypes 和 @MappedJdbcTypes 注解。

      @MappedTypes(MyType.class) // 指定 Java 类型
      @MappedJdbcTypes(JdbcType.VARCHAR) // 指定 JDBC 类型
      public class MyTypeHandler implements TypeHandler<MyType> {
          // ... 实现 TypeHandler 接口的方法 ...
      }
      
    1. 指定jdbcType(可选): 如果MyBatis无法推断,则必须通过jdbcType属性为null值指定数据库列的类型

示例:自定义一个将数据库中的 VARCHAR 类型转换为 Java 中的枚举类型的 TypeHandler:

// 假设有一个枚举类型
public enum Status {
    ACTIVE, INACTIVE, PENDING
}

// 自定义 TypeHandler
@MappedTypes(Status.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class StatusTypeHandler implements TypeHandler<Status> {

    @Override
    public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setString(i, null);
        } else {
            ps.setString(i, parameter.name()); // 将枚举的名称存储到数据库
        }
    }

    @Override
    public Status getResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return getStatus(value);
    }

    @Override
    public Status getResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
         return getStatus(value);
    }

    @Override
    public Status getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return getStatus(value);
    }
    
    private Status getStatus(String value){
         if (value == null) {
            return null;
        }
        try {
            return Status.valueOf(value); // 根据名称从数据库中获取枚举值
        } catch (IllegalArgumentException e) {
            return null; // 或者抛出异常
        }
    }
}

// 在 mybatis-config.xml 中注册 TypeHandler
<typeHandlers>
  <typeHandler handler="com.example.StatusTypeHandler"/>
</typeHandlers>

// 或者在 Mapper XML 文件中使用
<resultMap id="userResultMap" type="User">
    <result property="status" column="status" javaType="com.example.Status" jdbcType="VARCHAR" typeHandler="com.example.StatusTypeHandler"/>
</resultMap>

总结:

TypeHandler 是 MyBatis 中用于处理 Java 类型与 JDBC 类型之间转换的关键组件。MyBatis 内置了许多常用的 TypeHandler,在大多数情况下,我们可以直接使用内置的 TypeHandler。当需要处理特殊类型或自定义类型转换逻辑时,我们可以自定义 TypeHandler,并通过 XML 配置或注解的方式注册自定义的 TypeHandler。

mybatis源码学习------类型处理器模块 简介 ① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。 ② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及: 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。 而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。 类型处理器的作用如下图所示 TypeHandler接口及其实现类 TypeHandler接口中定义了两种类型的方 阅读详情

相关推荐

【Mybatis】TypeHandler - 自定义类型处理器

文章目录一、介绍二、上手试试自定义类型处理器应用处理器 一、介绍 MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。 可以在官方文档中看到,下面时默认的类型处理器。 但是,我们还是有个麻烦事 比如: javaBean中字段类型为Date,数据库中存储的是varchar类型; javabean中字段类型是Enum,数据库中存储的是varchar或者Integer。 javaBean中字段类

Java 405

【Mybatis】类型处理器TypeHandler的作用与自定义

MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。说人话,也就是java类型与jdbc类型之间的处换器,诸如最常见StringTypeHandler。尽管mybatis提供了许多类型处理器,但有时由于业务的需要,需要自定义类型处理器。例如,java实体类中Long[]数组类型如何以JSON字符串格式存储到数据库中varchar中,又如何能正常查询出,此时就需要自定义类型了。.........

weixin_45489731的博客 7440

VS2022离线安装总闪退?可能是这个--noWeb参数没加对(完整参数指南)

本文深入解析了VS2022离线安装过程中常见的闪退问题,指出核心原因往往在于命令行参数使用不当,特别是`--noWeb`参数。文章提供了完整的参数使用指南和实战解决方案,包括证书处理、安装器文件修复及自动化脚本,帮助用户彻底解决离线部署中的验证失败与闪退难题。

weixin_28842269的博客 758

Mybatis标签之 typeHandlers 使用及解析

Mybatis标签之TypeHandler使用及解析 一、typeHandlers作用 由于Java 类型和数据库的 JDBC 类型不是一一对应的(比如 String 与 varchar), 所以我们把 Java 对象转换为数据库的值,和把数据库的值转换成 Java 对象,需要经过 一定的转换,这两个方向的转换就要用到 TypeHandle

weixin_45538589的博客 7075

STM32+A4988控制步进电机

基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。

个人博客 4万+

家用电器维修必备:手把手教你用双向可控硅改造单相电机调速(附电路图)

本文提供了一份详细的家用电器维修指南,手把手教你如何利用双向可控硅为核心元件,为单相交流电机(如风扇、排气扇)实现平滑的无级调速改造。内容涵盖核心原理、安全须知、元件选型(如BT136、DB3)、电路图解析、分步搭建教程以及常见故障排查方法,旨在帮助维修爱好者和DIY用户安全、成功地完成这一实用且富有成就感的项目。

read5的博客 835

MyBatis自定义类型处理器 TypeHandler(通俗易懂,效率起飞),处理jsonb、数组、枚举类型。支持MybatisPlus

在 MyBatis 中,(类型处理器)的主要作用是帮助我们在 Java 代码中使用的数据类型(JavaType)和数据库中的数据类型(JdbcType)之间进行转换。`TypeHandler`(类型处理器)的主要作用是帮助我们在 Java 代码中使用的数据类型(`JavaType`)和数据库中的数据类型(`JdbcType`)之间进行转换。这就像是在 Java 世界和数据库世界之间搭建了一座桥梁。负责把 Java 类型的数据正确地放置到 SQL 语句的参数中。当你从数据库获取数据时(比如,查询操作)。

qq_41266196的博客 5754

FPGA之道(22)VHDL基本程序框架

在介绍详细的VHDL语法之前,让我们先来了解一下VHDL代码的基本程序框架,这样可以让我们先对VHDL程序设计有一个整体的概念把握,进而在后续的VHDL语法学习中做到有的放矢。

Reborn Lee 8308

mybatis解析-TypeHandler作用详解

TypeHandler被称作类型处理器,MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将Java对象转化为数据库支持的类型或者将获取到数据库值以合适的方式转换成 Java类型。 mybatis提供了31个默认的类型处理器,它们都位于org.apache.ibatis.type包下,这些默认的处理器能够满足我们大部分场景的需求。 本文接下来首先介绍TypeHandler接口的定义,之后介绍其在mybatis中如何使用,最后介绍一些my

龚厂长的博客 8301

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4900

RHEL 8 与 RHEL 7 与 RHEL 6 的比较,RHEL 8强到离谱!

Red Hat Enterprise Linux(RHEL)是企业级 Linux 发行版中最受欢迎的操作系统之一。RHEL 为服务器和企业环境提供了高性能、稳定性和安全性,适用于各种数据中心和云计算平台。自 RHEL 6 以来,Red Hat 对其操作系统进行了多次重大更新,RHEL 7 和 RHEL 8 带来了许多新的特性、工具和架构变化。

网络技术联盟站 707

MyBatis 类型处理器 TypeHandler

类型处理器 TypeHandler MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,用PreparedStatement 设置参数值,从 ResultSet 或CallableStatement 中取出一个值。MyBatis 内置了大部分基本类型的类型处理器,所以对于基本类型可以直接处理,当我们需要处理其他类型的时候就需要自定...

shmily的博客 667

仿真模型简单介绍

同时,各种以伯克利的Spice仿真程序的算法为核心的商用Spice电路仿真工具也随之产生,运行在PC和UNIX平台,许多都是基于原始的SPICE2G6版的源代码,这是一个公开发表的版本,它们都在Spice的基础上做了很多实用化的工作,比较常见的Spice仿真软件有HSpice、Pspice、Spectre、Tspice、SmartSpcie、IsSpice等,虽然它们的核心算法雷同,但仿真速度、精度和收敛性却不一样,其中以Synopsys公司的Hspice和Cadence公司的Pspice最为著名。...

小幽余生不加糖 8001

mybatis精通之路之TypeHandler初探

前言:直入正题,在我们利用mybatis作为持久层框架存储数据时,从mybatis接收参数到mysql存储数据,都会用到typeHandler类型处理器。这也就是从JavaType->JdbcType的转化过程。由于mybatis初始时已经内置大部分基础类型转化的TypeHandler,已经足够我们平常的简单应用开发了,所以大多数情况下并不需要我们自己去定义类型转换器。但是,当遇到一些特殊情况时,为

白哥哥的博客 1万+

uniapp:实现APP获取陀螺仪数据、加速传感器、线性加速传感器,uniApp实时监听陀螺仪【XYZ】数据及停止监听与资源释放等功能示例源码,根据需求做功能(完美兼容Android安卓、苹果ios)

uniapp陀螺仪,uniapp加速传感器,uniapp线性加速传感器,APP陀螺仪数据,uniapp app 端获取陀螺仪数据示例代码,手机中获取陀螺仪的数据,uniApp实时获取陀螺仪xyz数据,android陀螺仪方向,获得陀螺仪传感器,处理传感器数据,停止监听与资源释放,Android使用陀螺仪,uniapp苹果ios陀螺仪,uni-app设备之(加速计,罗盘,陀螺仪)插件安卓/IOS APP提供了获取陀螺仪数据的能力,手机陀螺仪传感器获得手机自身旋转的角度,陀螺仪获取旋转角度,陀螺仪、加速度传感器

✅ 精选推荐文章 4266

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Mybatis TypeHandler类型处理器

1. Mybatis TypeHandler简介 Mybatis 在预处理语句中设置一个参数,或者从结果集中取出一个值,都会用注册了的typeHandel处理。 因为不同得数据库厂商的数据类型有所不同,我们也可以自定义typeHandel,来设置Java传入数据库中的数据类型 ,及从数据库中取数据到java的数据类型。 这里存在两个概念,JavaType及JdbcType,TypeHandler就是定义这两个类型之间的转换。 Mybatis已经系统定义了一些常见的typeHande,在Mybatis 的源码

qq_26010957的博客 545

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MyBatis 类型处理器(TypeHandler)详解:打通 Java 与数据库的类型鸿沟

MyBatis TypeHandler解析:打通Java与数据库类型转换 摘要:MyBatis的TypeHandler是Java类型与数据库类型转换的核心组件,主要功能包括参数设置、结果获取和空值处理。文章详细介绍了内置TypeHandler的分类与对比,并演示了两种自定义TypeHandler的实战场景:JSON对象转换器(实现复杂对象与JSON字符串的转换)和枚举高级映射(自定义枚举值与数据库的映射关系)。通过继承BaseTypeHandler并实现特定方法,开发者可以灵活处理各种特殊数据类型转换需求,

qq_43414012的博客 1136

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MyBatis的类型处理器TypeHandler与自定义实现

【1】 类型处理器(typeHandlers) MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。 提示 从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。 类型处理器 Java 类型 JDBC 类型 BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的

小小默:进无止境 2268

[Mybatis]-[基础支持层]-类型转换处理-typeHandler

该系列文章针对 Mybatis 3.5.1 版本 一、TypeHandler 类型处理器介绍 MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用typeHandler类型处理器将获取到的值以合适的方式转换成 Java 类型,或者将 Java 类型映射成数据库支持的类型。 在 Mybatis 中内置了很多的TypeHandler,这些内置的TypeHandler存储在了TypeHandlerRegistry容器中。 如下图,...

保持敏感!保持学习! 278

MyBatis(15)——类型处理器typeHandlers

目录 一、类型处理器 1、typeHandler类型处理器具体用处: 2、typeHandler结构: 3、默认的类型处理器 二、自定义类型处理器处理枚举 1、MyBatis提供的两个枚举处理器 2、定义枚举类型处理器 一、类型处理器 1、typeHandler类型处理器具体用处: MyBatis在与数据库交互的时候,Executor对象会调用ParameterHandler对...

星_陨的博客 1286

此处理器类型不支持该安装程序包_[Mybatis]-[基础支持层]-类型转换处理-typeHandler...

该系列文章针对 Mybatis 3.5.1 版本一、TypeHandler 类型处理器介绍 MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用typeHandler类型处理器将获取到的值以合适的方式转换成 Java 类型,或者将 Java 类型映射成数据库支持的类型。在 Mybatis 中内置了很多的 TypeHandler ,这些内...

weixin_39653442的博客 370

【Mybatis系列】Mybatis之TypeHandler入门

TypeHandler” 通常指的是在软件开发中处理数据类型转换和操作的组件或模块。具体来说,TypeHandler 主要用于将一个数据类型转换为另一个数据类型,以便在不同的上下文中使用。在不同的编程语言和框架中,TypeHandler 的实现方式可能有所不同。在持久化层,比如与数据库的交互中,TypeHandler 可能用于将数据库中的数据类型与应用程序中的数据类型进行映射。例如,将数据库中的字符串字段映射为应用程序中的整数类型。在处理用户输入或从网络传输数据时,可能需要将字符串转换为数字、日期等。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

玩转mybatis-TypeHandler的运用

Mybatis

weixin_36837739的博客 421

记一次 mybatis plus+自定义类型处理器 TypeHandler

需求:实体 java类型 Timestamp、数据库字段 bigint -可存储long类型 思考:有大量类似数据的转换,手动转换类型进行存储和查询已经过于麻烦。 MyBatis为我们提供了解决办法:TypeHandler类型处理器。 类型处理器 TypeHandler MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一

e_shi_yi_p的博客 2090

MyBatis类型处理模块详解

MyBatis类型转换机制是连接Java应用与数据库的关键桥梁。本文深入分析了TypeHandler的核心架构和工作原理,包括:1)TypeHandler接口和BaseTypeHandler抽象类的设计;2)Java类型与JDBC类型的双向转换流程;3)参数设置和结果集获取时的类型转换实现。通过具体示例展示了String和Long类型的转换过程,揭示了MyBatis如何解决Java与数据库之间的类型映射问题,为开发者理解ORM框架的数据转换机制提供了清晰视角。

qq_41262225的博客 1142

mybatis插件Plugin、TypeHandler、二级缓存问题

本文介绍mybatis的三个部分:Plugin、TypeHandler、二级缓存问题。 mybatis插件Plugin使用与原理 mybatis使用方式: 1. 插件必须实现org.apache.ibatis.plugin.Interceptor接口。它可以拦截executor、statementHandler、resultHandler、parameterHandler接口。 由下图...

Peanuts_D 1241
上一篇: Spring Boot 项目中application.yml 和 bootstrap.yml 文件的区别
下一篇: MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值