当前位置: 首页 > news >正文

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候需要手动设置类型处理器才可以,这里记录一下类型处理器的设置

/*** UUID类型处理器*/
public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获取结果** @param resultSet  resultSet* @param columnName 列名* @return UUID结果* @throws SQLException SQL异常*/@Overridepublic UUID getNullableResult(ResultSet resultSet, String columnName)throws SQLException {return getValue(resultSet.getString(columnName));}/*** 获取结果** @param rs          结果集* @param columnIndex 列下标* @return UUID结果* @throws SQLException SQL异常*/@Overridepublic UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return getValue(rs.getString(columnIndex));}/*** 获取结果** @param cs          cs* @param columnIndex 列下标* @return 返回UUID结果* @throws SQLException SQL异常*/@Overridepublic UUID getNullableResult(CallableStatement cs, int columnIndex)throws SQLException {return getValue(cs.getString(columnIndex));}/*** 设置参数** @param ps        ps* @param i         i* @param parameter 参数* @param jdbcType  jdbc类型* @throws SQLException SQL异常*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) throws SQLException {if (null != parameter) {ps.setObject(i, parameter);}}/*** 获取结果** @param str 传参字符串* @return 返回UUID结果*/private UUID getValue(String str) {return notNull(str) ? UUID.fromString(str) : null;}/*** 非空判断** @param arg 参数* @return 判断是否不为空*/private boolean notNull(String arg) {return (null != arg && !arg.isEmpty());}
}
/*** UUID数组类型处理器*/
public class UUIDArrTypeHandler extends BaseTypeHandler<List<UUID>> {/*** 设置参数** @param ps        PreparedStatement 对象* @param i         参数索引* @param parameter UUID 列表* @param jdbcType  JDBC 类型* @throws SQLException SQL异常*/@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<UUID> parameter, JdbcType jdbcType) throws SQLException {if (parameter != null) {Array array = ps.getConnection().createArrayOf("uuid", parameter.toArray());ps.setArray(i, array);} else {ps.setNull(i, Types.ARRAY);}}/*** 获取结果** @param resultSet 结果集* @param columnName 列名* @return UUID 列表* @throws SQLException SQL异常*/@Overridepublic List<UUID> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {return getUUIDList(resultSet.getArray(columnName));}/*** 获取结果** @param rs          结果集* @param columnIndex 列索引* @return UUID 列表* @throws SQLException SQL异常*/@Overridepublic List<UUID> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return getUUIDList(rs.getArray(columnIndex));}/*** 获取结果** @param cs          CallableStatement 对象* @param columnIndex 列索引* @return UUID 列表* @throws SQLException SQL异常*/@Overridepublic List<UUID> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return getUUIDList(cs.getArray(columnIndex));}/*** 获取 UUID 列表** @param array SQL 数组对象* @return UUID 列表* @throws SQLException SQL异常*/private List<UUID> getUUIDList(Array array) throws SQLException {if (array == null) {return null;}Object[] uuidArray = (Object[]) array.getArray();List<UUID> result = new ArrayList<>();for (Object obj : uuidArray) {result.add((UUID) obj);}return result;}
}

配置完之后需要在实体类的对应属性上添加注解以使其生效

@TableField(typeHandler = UUIDTypeHandler.class)
private UUID uuid;
@TableField(typeHandler = UUIDArrTypeHandler.class)
private List<UUID> memberBenefitUuids;

tips:我之前的项目里由于连接的pgSQL数据库有json/jsonb和uuid类型,对应的Java类型我设置的是String和UUID这种,但是在写类型处理器的时候发现如果不给(Java)UUID这种类型的类型处理器加入到Spring容器中,那么项目总是起不来,会报错【在xml中找不到UUID类型对应的类型处理器】,查找了一下,发现Springboot在集成mybatis的时候,启动时会注册所有的类型处理器,我们都知道mybatis自带了许多常用的类型处理器,所以大部分情况下都是不需要自定义的,但是自带的处理器中没有针对UUID去做处理的类型处理器,导致检测XML文件的时候发现了UUID这种类型但是找不到对应的类型处理器(如果你没有在XML中手动指定类型处理器,这是很常见的,因为有很多地方要指定,难免漏掉。但是你如果全部都手动指定的话也不会报错,但是很麻烦)就会报错java.lang.IllegalStateException: No typehandler found for property uuid。所以这里需要针对UUID的类型处理器加上@Configuration注解,将它注册到容器中,这样在启动项目的时候mybatis就会检测到这个typeHandler,也就不会报错了。
在这里插入图片描述
部分源码如上图,这里就是在项目启动的时候尝试从容器中获取类型处理器
至于为什么json/jsonb的类型处理器不需要加注解,因为我Java中对应的类型是String,mybatis已经有了针对String类型处理的typeHandler,所以不会报错,但是实际使用还是要指定为自定义的typeHandler

相关文章:

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中&#xff0c;有的类型是UUID和UUID[]这种类型&#xff0c;在mybatis和这些类型交互的时候需要手动设置类型处理器才可以&#xff0c;这里记录一下类型处理器的设置 /*** UUID类型处理器*/ public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获…...

vue3 高德地图标注(飞线,呼吸点)效果

装下这两个 npm 忘了具体命令了&#xff0c;百度一下就行 “loca”: “^1.0.1”, “amap/amap-jsapi-loader”: “^1.0.1”, <template><div id"map" style"width: 100%;height: 100%;"></div> </template><script setup> …...

程序员成长秘籍:是迈向管理巅峰,还是深耕技术架构?

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 管理和架构 做技术的同学一般有两条职业发展路径&#xff0c;横向的管理路线和纵向的技术路线。管理路线对应的是管理岗&#xff0c;讲究的是排兵布阵&#xff0c;通过各种资源的优化配置发挥价值。技术路…...

xargs的参数及常用命令

1. xargs 命令简介 xargs 是一个非常有用的工具&#xff0c;它用于从标准输入&#xff08;stdin&#xff09;构建和执行命令行。xargs 可以将标准输入中以空格或换行符分隔的数据&#xff0c;转化为命令的参数传递给其他命令。 使用场景&#xff1a; 当某些命令不支持使用管…...

FLASK 数据库建立以及部署和表的创建

首先安装flask-sqlalchemy db SQLAlchemy(app) 一 Mmeber、User模型类的创建 # coding: utf-8 from app import db, appclass Member(db.Model):__tablename__ memberid db.Column(db.Integer, primary_keyTrue)membername db.Column(db.String(100), uniqueTrue, index…...

微信小程序的面试题

简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch() 区别 &#xff1f; wx.navigateTo() : 保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面 wx.redirectTo() : 关闭当前页面&#xff0c;跳转到应用内的…...

udp c语言实现组播的例子

一、组播与广播的区别 1、组播地址和广播地址是不同的概念 组播地址&#xff1a;用于将数据包发送到一组特定的接收者&#xff0c;只有加入该组播地址的设备才能接收数据。它提高了网络效率&#xff0c;因为发送者只需发送一份数据。 广播地址&#xff1a;用于将数据包发送到…...

ffmpeg面向对象——AVInputFormat与URLProtocol啥关系

《ffmpeg面向对象-rtsp拉流相关对象》和《ffmpeg面向对象——拉流协议匹配机制探索》探索过了输入格式匹配和底层协议匹配&#xff0c;且ffmpeg拉流是先是匹配输入格式——抽象为AVInputFormat类&#xff0c;然后再匹配url协议类——抽象为URLProtocol类。 它们是啥关系&#…...

【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;二叉搜索树 大家好&#xff0c;这里是店小二&#xff01;今天我们将深入探讨高阶数据结构中的AVL树。AVL树是一种自平衡的二叉搜索树&#xff0c;可以看作是对传统二叉搜索树的优化版本。如果你对数据结…...

中级软考软件设计师真题+模拟题+课件讲解+机考讲解模拟+笔记分享

软考真题分享 下载链接⬇️⬇️&#xff1a; 下载链接...

MySQL—视图

前言&#xff1a; 视图是一个虚拟的表&#xff0c;是基于一个或多个基本表或其他视图的查询结果集。视图本身不占据物理储存空间&#xff0c;仅仅只是一个查询的逻辑表示&#xff0c;物理上依赖于数据表的数据。 视图具有简单&#xff0c;安全&#xff0c;逻辑数据独立&#…...

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…...

服务器数据恢复—EMC存储RAID5磁盘阵列数据恢复案例

服务器数据恢复环境&#xff1a; 一台EMC某型号存储设备&#xff0c;该存储中有一组由12块&#xff08;包括2块热备盘&#xff09;STAT硬盘组建的raid5阵列。 服务器故障&#xff1a; 该存储在运行过程中突然崩溃&#xff0c;raid瘫痪。数据恢复工程师到达现场对故障存储设备进…...

使用 `netcat`(nc)工具进行TCP数据发送和接收

Netcat&#xff08;通常缩写为nc&#xff09;是一个功能强大的网络工具&#xff0c;常被称为“瑞士军刀”的网络工具。它用于在网络上进行各种操作&#xff0c;比如读写网络连接、调试和分析网络服务等。以下是关于Netcat的一些详细介绍&#xff1a; ### 主要功能 1. **TCP/U…...

Linux虚拟化技术嬗变综述

在信息技术飞速发展的今天&#xff0c;虚拟化技术已经成为数据中心、云计算和企业IT基础设施中不可或缺的一部分。Linux操作系统作为开源和灵活的代表&#xff0c;在虚拟化技术的发展中扮演了重要角色。本文将综述Linux虚拟化技术的演变&#xff0c;探讨其优势、应用场景&#…...

.NET 通过C#设置Excel工作表的页面设置

Excel文件数据准备就绪并需要以报告形式呈现时&#xff0c;调整Excel文件的页面设置变得尤为重要&#xff0c;不仅关乎文档的专业外观&#xff0c;还直接影响到打印或电子分享时的可读性和实用性。通过C#来自动化这一过程&#xff0c;不仅可以节省大量手动配置的时间&#xff0…...

Excel日期导入数据库变为数字怎么办

在Excel导入到数据库的过程中&#xff0c;经常会碰到Excel里面的日期数据&#xff0c;导进去过后变成了数字。 如下图&#xff1a; 使用navicate等数据库编辑器导入数据库后&#xff1a; 原因分析&#xff1a;这是因为日期和时间在excel中都是以数字形式存储的&#xff0c;这个…...

SSL---SSL certificate problem

0 Preface/Foreword 0.1 SSL certificate problem 开发过程中&#xff0c;gitlab-runner连接gitlab时候出现SSL 证书问题。 场景&#xff1a;公司的gitlab runner服务器引入了SSL证书&#xff0c;每年都会主动更新一次。当前的gitlab-runner运行在PC机器上&#xff0c;但是g…...

linux tar 打包文件去掉文件所在路径

一、准备目录 /root/tmp/images /root/tmp/images2 执行命令打包目录/root/tmp/images 到 /root/tmp/images.tar.gz 再解压到/root/tmp/images2 cd /root/tmp/images && tar -cvzf images.tar.gz * && mv images.tar.gz /root/tmp/ tar -C /root/tmp/image…...

MQ快速入门【详细】个人笔记 讲解通俗易懂

1.同步通讯和异步通讯 同步通讯&#xff1a;如果举个例子来说&#xff0c;同步通讯就像是两个人在打电话&#xff0c;一方说的话&#xff0c;能够立马传给另一方&#xff0c;消息的时效性非常高&#xff0c;但是相对的&#xff0c;只能是给一个人通讯&#xff0c;如果这个时候&…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...