Mybatis之类型转换器TypeHandler的初步了解及具体使用方法

news2025/3/14 3:10:38

一、TypeHandler简介
1、什么是TypeHandler?
简介:TypeHandler(类型转换器)在mybatis中用于实现 java类型 和 JDBC类型 的相互转换。mybatis使用 prepareStatement 来进行参数设置的时候,需要通过 TypeHandler 将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用 PrepareStatement 不同的set方法实现的;在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用 ResultSet 对象不同类型的get方法实现的;所以不同类型的 TypeHandler 其实就是调用 PrepareStatement 和 ResultSet 的不同方法来进行类型的转换,有些时候会在调用 PrepareStatement 和 ResultSet 的相关方法之前,可以对传入的参数进行一定的处理.。当我们没有指定 TypeHandler 的时候 mybatis 会根据传入参数的类型和返回值的类型调用默认的 TypeHandler 进行处理。对于一个 TypeHandler 需要配置 java类型(javaType) 和 JDBC类型(jdbcType),TypeHandler 的作用就是实现这两种类型的转换,在传入的参数为指定的Java类型时,将其转换为指定的JDBC类型,当返回值为指定JDBC类型时将其转换为配置的Java类型。
作用: 实现 javaType 与 jdbcType 之间的转换

2、mybatis默认定义的TypeHandler
MyBatis 系统已经创建好常用的 TypeHandler。在大部分的情况下无须显式地声明 jdbcType 和 javaType,或者用 TypeHandler 去指定对应的字段来实现数据类型转换,因为 MyBatis 系统会自己探测映射的数据类型,来自动选择合适的 TypeHandler。
MyBatis 自带的常见 TypeHandler有如下类型:
在这里插入图片描述
3、自定义 TypeHandler
虽然 Mybatis 提供的 TypeHandler(类型转换器)很多,可以完成很多中数据类型的转换,但有的时候仍然不能满足我们对于某一字段的转换要求,这时就需要自定义类型处理器。

二、如何自定义类型转换器
表结构:

create table ARTICLE
(
    ID          NUMBER(10) not null constraint ARTICLE_PK primary key,
    NAME        VARCHAR2(100) not null,
    ART_DESC    VARCHAR2(100),
    AUTHOR      VARCHAR2(100) not null,
    CREATE_TIME NUMBER(10)    not null,
    CONTENT     BLOB          not null,
    TYPE        NUMBER,
    EX_FIELD_01 VARCHAR2(100),
    EX_FIELD_02 VARCHAR2(100),
    EX_FIELD_03 VARCHAR2(100)
);

案例:上面这张表中的 content 字段为 BLOB 类型,如果查询中涉及到这个字段,该怎么处理?
1、pom依赖

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

2、定义类型转换处理类

package com.test.common.typeHandler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.*;

/**
 * sql 查询数据的时候将 BLOB 字段转换成 String 类型接收
 */
public class BlobToStringTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    Blob blob = rs.getBlob(columnName);
    return new String(blob.getBytes(1, (int)blob.length()));
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    Blob blob = rs.getBlob(columnIndex);
    return new String(blob.getBytes(1, (int)blob.length()));
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    Blob blob = cs.getBlob(columnIndex);
    return new String(blob.getBytes(1, (int)blob.length()));
  }

}

3、在 mapper.xml 文件中使用:在 result 标签中使用 typeHandler=“com.test.common.typeHandler.BlobToStringTypeHandler” 指定具体的自定义类型转换器

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.rabbitmq_producer.mapper.ArticleMapper">

    <resultMap type="com.test.rabbitmq_producer.entity.Article" id="ArticleMap">
        <result property="id" column="ID" jdbcType="INTEGER"/>
        <result property="name" column="NAME" jdbcType="VARCHAR"/>
        <result property="artDesc" column="ART_DESC" jdbcType="VARCHAR"/>
        <result property="author" column="AUTHOR" jdbcType="VARCHAR"/>
        <result property="createTime" column="CREATE_TIME" jdbcType="INTEGER"/>
        <result property="content" column="CONTENT" jdbcType="BLOB" typeHandler="com.test.common.typeHandler.BlobToStringTypeHandler"/>
        <result property="type" column="TYPE" jdbcType="INTEGER"/>
        <result property="exField01" column="EX_FIELD_01" jdbcType="VARCHAR" typeHandler="B"/>
        <result property="exField02" column="EX_FIELD_02" jdbcType="VARCHAR"/>
        <result property="exField03" column="EX_FIELD_03" jdbcType="VARCHAR"/>
    </resultMap>

    <!--查询指定行数据-->
    <select id="queryAllByLimit" parameterType="com.test.rabbitmq_producer.entity.Article" resultMap="ArticleMap">
        select
            ID, NAME, ART_DESC, AUTHOR, CREATE_TIME, CONTENT, TYPE, EX_FIELD_01, EX_FIELD_02, EX_FIELD_03
        from ARTICLE
        <if test="article != null">
            <where>
                <if test="id != null">
                    and ID = #{id}
                </if>
                <if test="name != null and name != ''">
                    and NAME = #{name}
                </if>
                <if test="artDesc != null and artDesc != ''">
                    and ART_DESC = #{artDesc}
                </if>
                <if test="author != null and author != ''">
                    and AUTHOR = #{author}
                </if>
                <if test="createTime != null">
                    and CREATE_TIME = #{createTime}
                </if>
                <if test="content != null and content != ''">
                    and CONTENT = #{content}
                </if>
                <if test="type != null">
                    and TYPE = #{type}
                </if>
                <if test="exField01 != null and exField01 != ''">
                    and EX_FIELD_01 = #{exField01}
                </if>
                <if test="exField02 != null and exField02 != ''">
                    and EX_FIELD_02 = #{exField02}
                </if>
                <if test="exField03 != null and exField03 != ''">
                    and EX_FIELD_03 = #{exField03}
                </if>
            </where>
        </if>
    </select>
    
</mapper>

备注:数据库表字段为 BLOB 类型的时候,mapper.xml 文件中的 jdbcType 对应应该也是 BLOB 类型,java 实体类中应该用 byte[] 接收,但是一般我们希望在实体类中用 String 来接收,所以正常情况下我们查询结果中的某个字段是 BLOB 类型的话,实体类只能用 byte[] 来接收,然后遍历所有查询结果,手动将 byte[] 转换成 String,这样的话效率会比较低。而如果使用自定义的类型转换器,就可以在查询完后自动进行转换,实体类中可以直接用 String 来接收,不用遍历手动进行类型转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP MESSAGE消息类的创建以及调用方法。

消息类的类型一共分为六种&#xff0c;分别如下表所示 TYPE描述使用效果是否终止事务A(Abortion)终止在PUPUP画面显示是I(Information)信息在PUPUP画面显示否E(Error)错误在状态栏显示是W(Warning)警告在状态栏显示否S(Success)成功在次画面显示否X(Exit)退出在强制终止的画面…

大数据培训Impala之优化

大数据培训Impala之优化 尽量将StateStore和Catalog单独部署到同一个节点&#xff0c;保证他们正常通行。 通过对Impala Daemon内存限制&#xff08;默认256M&#xff09;及StateStore工作线程数&#xff0c;来提高Impala的执行效率。 SQL优化&#xff0c;使用之前调用执行计…

SEO优化的策略_网站seo策略

现在SEO优化成为了每一个企业进行网络营销策划的重要命题,如何做好SEO优化更是企业经常在思考的问题,SEO优化做得好,不仅可以减少企业推广的费用,更是有效的提高了推广的效果,一个好的SEO优化策略应该如何完成呢?应该从以下5点做好网站seo策略。 SEO优化策略1.确定目的 …

MySQL 数据库 - 索引与事务

文章目录1.索引1.1 优缺点1.2 使用2.事务2.1 事务的使用2.2 四大特性2.2.1 原子性2.2.2 隔离性1.索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结…

[附源码]计算机毕业设计Node.jsX工厂电影网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

企业成立不到三年,能申报高企吗?

高企认定可谓是好处多多,不仅能享受税收优惠、专项补贴、贷款融资,还能提升企业核心竞争力,但在申报国家高新技术企业认定时会审核企业前三年的净资产增长率和销售收入增长率,这对于成立不满三年的企业而言,企业成长性这一项指标的得分就不可能拿到20分满分,甚至可能是0分。那么…

技术分享 | Jenkins 节点该如何管理?

Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等 Jenkins 的任务可以分布在不同的节点上运行节点上需要配置 Java 运行时环境&#xff0c;JDK 版本大于 1.5节点…

[附源码]计算机毕业设计Python房屋租赁信息系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

热门技术中的应用:容器技术中的网络-第29讲-容器网络:来去自由的日子,不买公寓去合租

如果说虚拟机是买公寓,容器则相当于合租,有一定的隔离,但是隔离性没有那么好。云计算解决了基础资源层的弹性伸缩,却没有解决PaaS层应用随基础资源层弹性伸缩而带来的批量、快速部署问题。于是,容器应运而生。 容器就是Container,而Container的另一个意思是集装箱。其实…

持续测试的3个关键点才能成功实施

摘要&#xff1a;除非你在过去的一两年里一直处于冬眠状态&#xff0c;否则我相信你已经充分意识到持续测试的好处&#xff1a;降低开发成本、减少浪费、提高系统可靠性、降低发布风险等等. 当然&#xff0c;您认为在现实世界中将其付诸实践并不像某些供应商那样简单。很明显&a…

Twitter整合营销的方法技巧

对于独立站卖家来说&#xff0c;在Twitter它不仅能获取有价值的客户信息&#xff0c;收集粉丝反馈&#xff0c;还能影响消费者的决策。73%的数据显示&#xff0c;Twitter用户每个月都会在网上购物&#xff0c;甚至比较Facebook还要高。所以今天就和卖家们分享Twitter营销到底该…

6 | 渗透测试工具Kali Linux安装与使用

1 Kali Linux简介 渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法&#xff0c;这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析。渗透测试所需的工具可以在各种Linux操作系统中找到&#xff0c;需要手动安装这些工具。由于…

[附源码]Nodejs计算机毕业设计竞赛报名管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

艾美捷葡萄糖比色测定试剂盒参数说明和相关研究

艾美捷葡萄糖比色测定试剂盒仅供研究使用&#xff0c;该试剂盒是一种比色测定试剂盒,设计用于定量和检测血清、血浆、尿液、缓冲液和组织培养基中的葡萄糖而设计。 艾美捷葡萄糖比色测定试剂盒基本信息&#xff1a; 英文名字&#xff1a;Glucose Colorimetric Assay Kit 编号…

语音识别芯片LD3320介绍续

语音识别芯片LD3320寄存器介绍 语音识别芯片LD3320寄存器大部分都是有读和写的功能&#xff0c;有的是接受数据的&#xff0c;有的是设置开关和状态的。寄存器的地址空间为8位&#xff0c;可能的值为00H到FFH。但除了本文档介绍的寄存器&#xff0c;其他大部分为测试或保留功能…

[封装自己的ui组件库] upload的实现与难点

效果 1、服务文件(tmp为保存上传文件文件夹) 2、点击上传 3、图片列表 4、拖拽 5、手动上传 5、上传失败 6、服务 问题 1、如何打开文件列表 2、如何取出文件 3、对取出的文件校验&#xff1f; 4、如何发送请求(多文件上传&#xff1f;) 5、如何完成上传列表展示 6、拖拽…

基于遗传算法改进的DELM预测 - 附代码

遗传算法改进的深度极限学习机DELM的回归预测 文章目录遗传算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.遗传算法4.遗传算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https:…

three.js之由线到管(管道缓冲几何体)

文章目录简介例子解释专栏目录请点击 简介 一条曲线怎么生成一个个曲线路径一行的管状呢&#xff1f;这个时候我们就用到了three.js的一个api:TubeGeometry&#xff0c;官网 例子 <!DOCTYPE html> <html lang"en"><head><meta charset"…

python连接OB绑定变量问题

某现场客户程序使用python&#xff0c;引用了jaydebeapi库连接oceanbase的jdbc驱动oceanbase-client-*.*.*.jar JayDeBeApi是一个python模块&#xff0c;可通过它来使用java的JDBC连接数据库&#xff0c;为该数据库提供了 Python DB-API v2.0 OB官网给的jaydebeapi连接ob的列子…

Hadoop2.x源码64位编译

编译必须环境&#xff1a;hadoop源码【使用的是2.10.2版本】、JDK8、maven、ant 、protobuf【版本必须是2.5.0&#xff0c;否则编译会报错org.apache.maven.plugin.MojoExecutionException: protoc version is libprotoc 3.21.12, expected version is 2.5.0】 安装 glibc-hea…