Mybatis进阶之自定义TypeHandler

news2024/9/27 7:19:48

实际应用开发中的难免会有一些需求要自定义一个TypeHandler ,比如这样一个需求:前端传来的性别是 男, 女,但是数据库定义的字段却是tinyint 类型( 1:男 2:女)。此时可以自定义一个年龄的类型处理器,进行转换。

定义TypeHandler

package com.mtaite.study.mybatis.handler;

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 org.springframework.util.StringUtils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


@MappedJdbcTypes(JdbcType.INTEGER)
@MappedTypes(String.class)
public class GenderTypeHandler extends BaseTypeHandler {

      //设置参数,这里将Java的String类型转换为JDBC的Integer类型
      @Override
      public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
           ps.setInt(i, parameter.toString().equals("男")? 1:2);
       }
      //  以下三个参数都是将查询的结果转换
      @Override
      public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
          return rs.getInt(columnName)==1?"男":"女";
     }
     @Override
     public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
       return rs.getInt(columnIndex)==1?"男":"女";
     }
     @Override
     public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
          return cs.getInt(columnIndex)==1?"男":"女";
     }
}

这里涉及到两个注解:

  1. @MappedTypes :指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解上的配置将被忽略。
  2. @MappedJdbcTypes :指定与其关联的 JDBC 类型列表。 如果在jdbcType 属性中也同时指定,则注解上的配置将被忽略。

配置Mybatis配置文件

配置mapper的xml文件中的字段

通过上面的配置就可以实现性别字段的数据转换了,可以拿源代码试试哦。

源码中如何执行TypeHandler

既然会使用TypeHandler 了,那么肯定要知道其中的执行原理了,在Mybatis中类型处理器是如何在JDBC 类型和Java 类型进行转换的,下面的将从源码角度详细介绍。

入参如何转换

肯定是发生在设置参数的过程中,详细的代码在PreparedStatementHandler 中的parameterize() 方法中,这个方法就是设置参数的方法。源码如下:

实际执行的是DefaultParameterHandler 中的setParameters 方法,如下:

从上面的源码中可以知道: typeHandler.setParameter(ps, i + 1,value, jdbcType); 就是调用类型处理器中的设置参数的方法,将Java 类型转换为JDBC 类型。

结果如何转换

这一过程肯定是发生在执行查询语句的过程中,其中的ResultSetHandler 这个组件就是对查询的结果进行处理的,那么肯定是发生在这一组件中的某个方法。 在PreparedStatementHandler 执行查询结束之后,调用的是ResultSetHandler 中的handleResultSets() 方法,对结果进行处理,如下:

最终是在DefaultResultSetHandler 中的getPropertyMappingValue() 方法中调用了TypeHandler 中的getResult() 方法,如下:

扩展:Mybatis提供了许多默认处理器

想想这个功能还可以用于什么场景呢?

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

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

相关文章

Linux学习笔记——Linux实用操作(一)

04、Linux实用操作 4.1、各类小技巧(快捷键) 学习目标: 掌握各类实用小技巧 强制停止退出、登出历史命令搜索光标移动 1、Ctrlc强制停止 Linux某些程序的运行,如果想要强制停止它,可以使用快捷键Ctrlc 命令输入…

一个基于Vue+SpringBoot的个人博客项目,含数据库文件

blogSpringBoot 项目介绍 完整代码下载地址:一个基于VueSpringBoot的个人博客项目,含数据库文件 该项目是个人博客项目,采用Vue SpringBoot开发。 后台管理页面使用Vue编写,其他页面使用Thymeleaf模板。 项目演示地址&#…

什么是 MySQL 的“回表”?

1. 索引结构 要搞明白这个问题,需要大家首先明白 MySQL 中索引存储的数据结构。这个其实很多小伙伴可能也都听说过,BTree 嘛! BTree 是什么?那你得先明白什么是 B-Tree,来看如下一张图: 前面是 B-Tree&am…

不止稳定快速,看华为云CDN如何在国际云服务市场中“分蛋糕”

互联网时代,网络的应用已十分普及,但依然存在下载慢、网络卡顿的现象。如企业业务运行过程中出现的卡顿现象导致数据延时;各校因疫情等原因网课时间长、访问应用人数过多,造成网络卡顿现象严重,无法带来良好的上课体验…

ArcGIS基础实验操作100例--实验16对字段自定义赋值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验16 对字段自定义赋值 目录 一、实验背景 二、实验数据 三、实验步骤 (1…

玩转云服务器,怎样用云服务器架设搭建游戏:浪剑天下架设教程,手把手教你架设游戏服务器,小白一看就会

服务器详情:服务器系统:LINUX-CENTOS7.6服务器配置:2核4G以上配置 搭建教程: 第一步:安装宝塔: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…

Allegro如何输出IPC文件操作指导

Allegro如何输出IPC文件操作指导 IPC文件是PCB上所有网络连接关系文件,在PCB生产前网表比对必须的文件,如下图 如何输出IPC文件,具体操作如下 选择File选择IPC356

磁实验比较-反激式变压器(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

代码随想录拓展day5 129. 求根节点到叶节点数字之和;1382.将二叉搜索树变平衡;100. 相同的树;116. 填充每个节点的下一个右侧节点指针

代码随想录拓展day5 129. 求根节点到叶节点数字之和;1382.将二叉搜索树变平衡;100. 相同的树;116. 填充每个节点的下一个右侧节点指针 全部都是关于二叉树的题目,对二叉树的遍历方式又是一个复习。 129. 求根节点到叶节点数字之…

Java 访问权限控制

使用访问权限控制的原因: 使用户不要触碰到那些不该触碰的部分类库设计者可以更改类的内部工作模式,而不必担心整体程序造成影响 访问权限修饰词 Java具有三种访问权限修饰词(public private protected),划分出了四种访问权限(public prot…

WeakHashMap引起内存溢出,线程数剧增

1.问题背景 代码通过jarLoader的方式,实现了一个数据库多个客户端版本兼容的情况,一个客户端使用一个jarLoader,实现jar的隔离。 同时,jarLoader使用weekhashmap做缓存。 hive做批量查询表的元数据时,引入了线程池。…

NodeJS学习笔记一

文章目录1. 模块化1.1 模块作用域2. 内置API模块3. 自定义模块3.1 向外共享模块作用域中的成员3.2 使用误区3.3 CommonJS模块化规范4. 第三方API模块4.1 npm包管理目录4.2 包管理配置文件 package.json4.3 devDependencies节点4.4 切换npm的包镜像源4.5 包的分类4.5.1 项目包4.…

【cfeng-Work】work项目理解

work 项目 内容管理入职项目环境搭建商用项目 和 学习项目经验分享easily 分享work 见解 学习项目(非商用)相比工作中的商用项目差别还是很大的… Cfeng 最近开始工作, 接下来我将分享一下对于学校中的project环境和 work环境的相关理解 入职…

生成式对抗网络(GAN)原理推导与网络构建思路

0 引言 设想这样的场景:你是一个工作室的老板,你的工作室主要用来生产名画的赝品;而真正的名画则为前人所创造,存放在收藏室中。你的赝品画会和真品画一起被鉴定家鉴定,而你的终极目标是成为一个以假乱真的工艺大师。…

设置 Postman 环境并调用 API

云开发自带 API 调试 功能,可快速进行 API 接口调试,同时也支持通过 Postman 调用 API 获取设备信息或控制设备。本文介绍如何设置调用云开发 API 的 Postman 开发环境及调用接口实践。 配置环境 安装 Postman 8.2.2 及以上版本桌面软件。 版本过低会出…

Python类中的__init__() 和 self 的解析

1、Python中self的含义 self,英文单词意思很明显,表示自己,本身。 此处有几种潜在含义: 1.这里的自己,指的是,实例Instance本身。 2.同时, 由于说到“自己”这个词,都是和相对而…

《计算机网络》——第七章知识点

防火墙:特殊编程的路由器,实施访问控制策略。分为网络级防火墙(防止网络出现非法入侵)和应用级防火墙(进行应用的访问控制)。 本次文章详细PDF请点击以下链接查看: https://download.csdn.net/download/qq_53142796/87353770https://download.csdn.n…

市场回暖进行时,实体店商户们千万不要做这三件事!

随着防控措施的进一步优化,市场环境逐渐复苏,许多商户都趁着这段时间开始着手做准备,想要趁年前赚到消费回暖的第一波红利。 但是方向一旦错了,不管付出的努力有多少,最终也只能和想要的结果背道而驰;为了避…

图文结合带你搞懂MySQL日志之Slow Query Log(慢查询日志)

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:KAiTO文章来源:GreatSQL社区原创 什么是慢查询日志 MySQL 的慢查询日志,用来记录在 M…

ORB-SLAM2 --- Tracking::Track 追踪线程解析

1.函数作用 ORB-SLAM2的三大线程之一---跟踪线程,负责估计运动信息、跟踪局部地图。 追踪线程的主要工作原理就是我们从数据集中读入一帧帧,刚开始的时候跟踪线程没有进行初始化(没有初始化不知道世界坐标系的原点和相机的位姿)&a…