SpringBoot整合MyBatis使用自定义TypeHandler

news2025/6/30 5:18:16

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

SpringBoot整合MyBatis使用自定义TypeHandler

  • 1. 前言
  • 2. 自定义TypeHandler的应用场景
  • 3. 实现自定义 TypeHandler
  • 4. 在 MyBatis 配置中使用 TypeHandler
    • 方式一:在mybatis-config.xml中配置
    • 方式二:使用注解配置
  • 5. 在实体类中应用自定义TypeHandler
  • 6. 总结

1. 前言

在 Spring Boot 项目中集成 MyBatis 时,我们有时需要处理数据库字段与 Java 对象属性之间的特殊转换,这时可以使用 MyBatis 提供的自定义 TypeHandlerTypeHandler 是 MyBatis 用于在 JDBC 和 Java 类型之间进行映射的接口。当默认的类型映射不能满足需求时,自定义 TypeHandler 就非常有用。

本章节就跟着博主一起来学习如何自定义TypeHandler

2. 自定义TypeHandler的应用场景

日常开发过程种自定义 TypeHandler 主要用于以下场景:

  • 数据库中的字段类型与 Java 中的字段类型不匹配,例如数据库中存储 JSON 字符串,而在 Java 中使用自定义的对象。
  • 数据库中的枚举值需要与 Java 枚举进行映射。
  • 需要对数据库的特殊字段类型进行自定义的序列化和反序列化处理。例如:数据库中逗号分隔字符串转换为List集合

3. 实现自定义 TypeHandler

假设我们有一个需求,数据库中存储了一个 JSON 字符串,如:

{"city":"广州市", "street":"天河区棠下街道"}

而我们希望在 Java 中将其映射为一个对象。首先,我们定义一个简单的对象类 Address

package com.example.demo.model;

public class Address {
    private String street;
    private String city;

    // getters and setters
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

接下来,我们实现自定义的 TypeHandler,将 JSON 字符串转换为 Address 对象。

package com.example.demo.typehandler;

import com.example.demo.model.Address;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.*;

public class AddressTypeHandler extends BaseTypeHandler<Address> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType) throws SQLException {
        try {
            ps.setString(i, objectMapper.writeValueAsString(parameter));
        } catch (JsonProcessingException e) {
            throw new SQLException("Error converting Address to String", e);
        }
    }

    @Override
    public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String json = rs.getString(columnName);
        return parseAddress(json);
    }

    @Override
    public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String json = rs.getString(columnIndex);
        return parseAddress(json);
    }

    @Override
    public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String json = cs.getString(columnIndex);
        return parseAddress(json);
    }

    private Address parseAddress(String json) throws SQLException {
        if (json == null) {
            return null;
        }
        try {
            return objectMapper.readValue(json, Address.class);
        } catch (JsonProcessingException e) {
            throw new SQLException("Error converting String to Address", e);
        }
    }
}

4. 在 MyBatis 配置中使用 TypeHandler

要让 MyBatis 知道我们的自定义 TypeHandler,可以在 mybatis-config.xml 中进行配置,或者通过注解的方式。

方式一:在mybatis-config.xml中配置

<typeHandlers>
    <typeHandler handler="com.example.demo.typehandler.AddressTypeHandler" javaType="com.example.demo.model.Address" jdbcType="VARCHAR"/>
</typeHandlers>

方式二:使用注解配置

Mapper 接口的方法上直接使用 @Result 注解配置:

package com.example.demo.mapper;

import com.example.demo.model.Address;
import com.example.demo.model.User;
import com.example.demo.typehandler.AddressTypeHandler;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT id, name, address FROM user WHERE id = #{id}")
    @Results({
            @Result(column = "address", property = "address", typeHandler = AddressTypeHandler.class)
    })
    User findById(int id);

    @Insert("INSERT INTO user(name, address) VALUES(#{name}, #{address, typeHandler=com.example.demo.typehandler.AddressTypeHandler})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);
}

5. 在实体类中应用自定义TypeHandler

假设我们有一个 User 类,其中包含 Address 字段。

package com.example.demo.model;

public class User {
    private int id;
    private String name;
    private Address address;

    // getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

6. 总结

Spring Boot 项目中集成 MyBatis 时,自定义 TypeHandler 是处理数据库与 Java 对象之间复杂转换的重要工具。通过 TypeHandler,我们可以轻松实现如 JSON 字符串与 Java 对象之间的转换、枚举映射、以及其他复杂的数据类型转换。灵活运用 TypeHandler 可以简化代码逻辑,提高项目的可维护性。

自定义 TypeHandler 适用于处理那些不能被 MyBatis 默认处理的场景。在实际开发中,建议根据业务需求合理使用 TypeHandler,确保数据的准确性和一致性。

如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


在这里插入图片描述

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

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

相关文章

系统知识小百科:如何禁用电脑无关软件!

禁用电脑上的无关软件是提升系统性能和安全性的有效手段。 以下是一些主要的方法来帮助你禁用这些软件&#xff1a; 一、通过Windows系统设置卸载无用软件 打开设置&#xff1a;按下Win I打开Windows设置。 进入应用管理&#xff1a;点击“应用”选项&#xff0c;这里会列出…

2024最新盘点!哪些仓库管理系统值得推荐?

本文将对16款仓库管理系统进行盘点&#xff1a; 简道云仓库管理系统、Oracle Warehouse Management、富勒、音飞储存、Microsoft Dynamics 365、金蝶、Logiwa、易订货、Fishbowl Warehouse、百卓轻云、智慧记、Oracle NetSuite、鸿链科技 WMS 仓库管理系统、Infor CloudSuite、…

武汉流星汇聚:亚马逊赋能中小企业,跨境电商市场举足轻重地位稳

在全球经济一体化的浪潮中&#xff0c;跨境电商作为推动国际贸易的重要力量&#xff0c;正以前所未有的速度发展。在这场全球性的商业竞赛中&#xff0c;亚马逊以其卓越的市场表现、强大的技术实力和深厚的品牌影响力&#xff0c;稳居跨境电商市场的领头羊地位&#xff0c;其举…

视频美颜SDK与直播美颜插件的开发指南:从基础到高级应用

今天&#xff0c;笔者将详细讲解如何从基础到高级应用开发视频美颜SDK与直播美颜插件。 一、视频美颜SDK的基础概念与架构设计 视频美颜SDK是一种集成在移动应用或桌面应用中的软件开发工具包&#xff0c;允许开发者在视频流中实现实时美颜效果。其核心功能包括肤色调整、磨皮…

Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

前言 在Vue 3.5.0-beta.3版本中新增了一个base watch函数&#xff0c;这个函数用法和我们熟知的watch API一模一样。区别就是我们之前用的watch API是和Vue组件以及生命周期是一起实现的&#xff0c;他们是深度绑定的。而Vue3.5新增的base watch函数是一个新的函数&#xff0c…

飞速(FS)400G SR4光模块概述

随着光网络领域新技术的不断涌现&#xff0c;数据传输的能力和效率也在持续提升。400G SR4光模块的出现不仅扩展了短距离光通信的可能性&#xff0c;还为未来迈向800G及更高带标准宽奠定了基础。本文深入探讨了飞速&#xff08;FS&#xff09;400G SR4光模块的特点和重要性&…

《计算机操作系统》(第4版)第10章 多处理机操作系统 复习笔记

第10章 多处理机操作系统 一、多处理机系统的基本概念 1. 多处理机系统的引入 (1)CPU 时钟频率接近极限。 (2)增加系统吞吐量。 (3)节省投资。 (4)提高系统可靠性。 2.多处理机系统的类型 (1)紧密耦合MPS 和松散耦合MPS ①紧密耦合MPS 紧密耦合通常是通过高速总线或高速交叉开…

页面设计任务 商品详情页(带评论区)

目录 效果图&#xff1a; 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.产品信息部分 2.用户评论区域 效果图&#xff1a; 任务描述 页面结构: 页面应包括一个标题部分、一个产品展示区和一个客户评价区。使用图片展示产品&#xff0c;并添加描述。客户评价区展示一…

删除Vue2残留配置文件解决异常:Cannot find module ‘@vue/babel-plugin-transform-vue-jsx‘

背景 完成Vue2代码升级为Vue3后&#xff0c;将新代码上传至代码库。在修改源代码库代码后&#xff0c;启动项目&#xff0c;提示&#xff1a;Cannot find module ‘vue/babel-plugin-transform-vue-jsx‘&#xff0c;尝试安装该第三方库后仍然无效。 解决方案&#xff1a; 删…

浅谈【数据结构】图-图的存储

目录 1、图的存储 2、邻接表 3、十字链表 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff01;&#xff01;…

知识竞赛中情境答题环节竞赛规则有哪些设计方案

情境题通常会给出一个具体的情景或场景&#xff0c;然后要求选手在该情境下回答问题、提出建议、解决问题等。目的是考察选手在特定情境下的分析和解决问题能力。一般由评委进行打分。 1.情境题可以是视频题&#xff0c;也可以是表演题&#xff0c;由选手抽一个题&#xff0c;…

东南亚媒体发布:5种东南亚地区媒体发稿技巧

东南亚国家是一个具有丰富多彩的文化的特点和媒体环境中的地域。想要在这个地区取得成功营销推广产品和服务&#xff0c;掌握如何有效与东南亚地区媒体协作尤为重要。下面我们就详细介绍五种在东南亚媒体发稿技巧&#xff0c;可以帮助读者高效地吸引住目标群体。 1.掌握市场定位…

机械学习—零基础学习日志(如何理解概率论8)

随机变量的协方差与相关系数 来一道练习题&#xff1a; 要先求出&#xff0c;a的数值&#xff1a; 要求联合分布律&#xff1a; 再求期望&#xff1a; 计算相关数值&#xff1a; 最后得到结果&#xff1a; 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08…

DaxPay:一套开源支付网关系统【送源码】

项目介绍 DaxPay是一套开源支付网关系统&#xff0c;已经对接支付宝、微信支付、云闪付相关的接口。可以独立部署&#xff0c;提供接口供业务系统进行调用&#xff0c;不对原有系统产生影响 特色功能 封装各类支付通道的接口为统一的接口&#xff0c;方便业务系统进行调用&am…

yocto | 基于Linux的定制系统跑Qt app(第二集)bitbake工作流程

点击上方"蓝字"关注我们 01、bitbake简介 >>> bitbake是OpenEmbedded构建系统的引擎,通过解析一系列配置文件(主要为recipes,即bb/bbappend文件)来创建任务列表,并根据依赖关系依次执行。通过bitbake -c listtasks xxx(模块名或映像名)命令可以查看…

【工具】Windows 上安装 PostgreSQL(图文详情)

目录 0.背景 1.简介 2.安装步骤 1&#xff09;下载地址 2&#xff09;双击安装包进行下载【请以管理员身份打开并安装】 3&#xff09;安装步骤 4&#xff09;安装中 5&#xff09;安装完成 0.背景 最近在学习大数据规模处理的相关课程&#xff0c;需要安装这个数据库以…

公园的客流统计意义何在,有哪些积极作用

随着城市化进程的加快&#xff0c;人们越来越重视休闲娱乐和亲近自然的机会。公园作为市民休闲放松的重要场所&#xff0c;其管理和维护的质量直接影响着市民的生活质量和城市的形象。客流统计在公园管理中扮演着重要角色&#xff0c;不仅可以帮助公园管理者更好地理解游客的行…

Ant Design Vue修改表格样式

原效果&#xff1a; 修改背景色和字体&#xff0c;包括表头和表体&#xff0c;要分开设置&#xff1a; :deep .ant-table-thead>tr>th {background: rgba(255, 255, 255, 0);//去掉表头背景color: rgb(100, 181, 220);font-weight: bold;border: none;//去掉表头边框}:d…

分组汇总后再根据数量拼上不同文字

Excel某表格有2列。 AB1Apples32Apples03Bananas14Bananas65Cantaloupe06Kiwis27Kiwis28Kiwis1 要求&#xff1a;按第1列分组&#xff0c;如果组内第2列大于0则对当前行进行计数&#xff0c;否则不计数&#xff1b;计数结果等于1则附加Occurrence&#xff0c;否则附加 Occurr…

连发3篇JHM !东北林业大学严善春教授和姜礅教授研究团队在重金属污染生态学与森林昆虫学交叉研究领域取得一系列新进展!

本文首发于“生态学者”微信公众号&#xff01; 近日&#xff0c;东北林业大学森林生态系统可持续经营教育部重点实验室严善春教授和姜礅教授项目组在重金属污染生态学与森林昆虫学交叉研究领域取得新进展。相关结果以“Cd exposure confers β-cypermethrin tolerance in Lym…