mybatis自定义类型控制器(TypeHandler)处理将字符串处理为集合

在这里插入图片描述

1. 问题:

假设这么一个场景
在这里插入图片描述

localurl里面的值大概这样:dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串

如果我在sql表中有一个字段(local_url)是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加值。我需要的是里面的dwad21.jpg,最好做集合处理。

🌴 最好的情况就是使用sql映射到对象的时候就把把字符串变成集合dwad21.jpg,dwad22.jpg,dwad.23.jpg => {dwad21.jpg,dwad22.jpg,dwad.23.jpg}

🌴 然后使用insert或者update的时候自动把集合变成字符串{dwad21.jpg,dwad22.jpg,dwad.23.jpg} =>dwad21.jpg,dwad22.jpg,dwad.23.jpg

2. 解决思路:

2.1.typehandler官网介绍

主要是对请求数据或者接受数据进行自定义映射处理。

我只能说mybaits非常任性了提供了自定义类型转换器。

mybatis官网=>配置=>类型处理器
《------------------------------------------------------------------》
功能:MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

在这里插入图片描述
下面是常用的数据类型的默认使用的类型处理器。

类型处理器Java 类型=>JDBC 类型
BooleanTypeHandlerjava.lang.Boolean,boolean =>BOOLEAN
ByteTypeHandlerjava.lang.Byte,byte => NUMERIC,BYTE
ShortTypeHandlerjava.lang.Short, short =>NUMERIC , SMALLINT
IntegerTypeHandlerjava.lang.Integer, int =>NUMERIC , INTEGER
LongTypeHandlerjava.lang.Long, long => NUMERIC , BIGINT
FloatTypeHandlerjava.lang.Float, float => NUMERIC , FLOAT
DoubleTypeHandlerjava.lang.Double, double=> NUMERIC ,DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal =>NUMERIC, DECIMAL
StringTypeHandlerjava.lang.String => CHAR, VARCHAR

2.2. 创建自定义handler

你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:

  1. 实现 org.apache.ibatis.type.TypeHandler 接口,
  2. 继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。比如:

在大部分使用场景中mybaitis的默认类型转换器就可以帮助大家的java对象到jdbc对象的转换。

但是我的整的花活显然不是满足。正好mybatis允许我们自定义类转换器。

我们这里使用实现接口的方法进行类型控制器的声明

public class StringToListTypeHandler implements TypeHandler<List<String>> {@Overridepublic void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {if (parameter != null) {ps.setString(i, String.join(",", parameter));} else {ps.setNull(i, jdbcType.TYPE_CODE);}}@Overridepublic List<String> getResult(ResultSet rs, String columnName) throws SQLException {String columnValue = rs.getString(columnName);return convertStringToList(columnValue);}@Overridepublic List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {String columnValue = rs.getString(columnIndex);return convertStringToList(columnValue);}@Overridepublic List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {String columnValue = cs.getString(columnIndex);return convertStringToList(columnValue);}private List<String> convertStringToList(String columnValue) {if (columnValue != null) {return Arrays.asList(columnValue.split(","));} else {return null;}}
}
  • setParameter 方法:这个方法用于将 Java 对象的参数设置到 PreparedStatement 中,通常用于将参数绑定到 SQL 语句中的占位符。在这个示例中,它将 List 类型的参数转换为逗号分隔的字符串,并设置到 PreparedStatement 中。如果参数为 null,它将设置为数据库类型的 null 值。

  • getResult(ResultSet rs, String columnName):从 ResultSet 对象中获取结果,根据列名 columnName 获取对应的列的值。

  • getResult(ResultSet rs, int columnIndex):从 ResultSet 对象中获取结果,根据列索引 columnIndex 获取对应的列的值。

  • getResult(CallableStatement cs, int columnIndex):从 CallableStatement 对象中获取结果,根据列索引 columnIndex 获取对应的列的值。通常,这种情况用于从存储过程中获取结果。
    🌴一般只实现一个方法即可

2.3. 注册类型转换器

要注意 MyBatis 不会通过检测数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明字段是 VARCHAR 类型

<typeHandlers><typeHandler handler="com.chen.behindimagesmanage.handler.StringToListTypeHandler" javaType="java.util.List<java.lang.String>" jdbcType="VARCHAR"/>
</typeHandlers>

当然这里也可以配置别名,如果这里设置了类型在mapper里就可以不用设置了。

2.4. mapper使用类型转换器

  1. mapper xml文件
<?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.chen.behindimagesmanage.dao.FileDao"><!-- 定义一个查询语句 --><resultMap id="imageMetaDataResultMap" type="com.chen.behindimagesmanage.pojo.ImageMetaData"><id property="id" column="id" /><result property="md5" column="md5" /><result property="aliyunUrl" column="aliyun_url" /><result property="localUrl" column="local_url" typeHandler="com.chen.behindimagesmanage.handler.StringToListTypeHandler" /><result property="version" column="version" /></resultMap><select id="getAllImg" resultType="imageMetaDataResultMap">SELECT * FROM image_metadata</select><!-- 定义一个更新语句 --><parameterMap id="imageMetaDataParamMap" type="com.chen.behindimagesmanage.pojo.ImageMetaData"><parameter property="id" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/><parameter property="md5" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><parameter property="aliyunUrl" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/><parameter property="localUrl" typeHandler="com.chen.behindimagesmanage.handler.StringToListTypeHandler"/><parameter property="version" jdbcType="INTEGER" javaType="int" mode="IN"/></parameterMap><update id="updateLocalUrl" parameterType="imageMetaDataParamMap">UPDATE image_metadata SET  local_url= #{imageMetaData.localUrl}, version = #{imageMetaData.localUrl} + 1 WHERE version = #{imageMetaData.localUrl}</update></mapper>
  1. mapper接口层
@Mapper
public interface FileDao {/*** 获取所有img归属信息* @return 所有归属信息*/List<ImageMetaData> getAllImg();/*** 更新元数据归属服务器* @param imageMetaData 更新的元数据列* @return 影响行*/int updateLocalUrl(ImageMetaData imageMetaData);
}

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

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

相关文章

【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用

概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集&#xff08;例如&#xff0c;月份名称&#xff09;&#xff1b;对于浮点数值&#xff0c;请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…

Hadoop3教程(二十三):Yarn的三大调度器

文章目录 &#xff08;129&#xff09;FIFO调度器&#xff08;130&#xff09;容量调度器特点资源分配算法 &#xff08;131&#xff09;公平调度器特点缺额的定义队列资源分配方式基于FIFO策略基于Fair策略资源分配算法 DRF策略 参考文献 &#xff08;129&#xff09;FIFO调度…

搭建react项目

一、环境准备 1、安装node 官网下载安装&#xff1a;https://nodejs.org/en 注&#xff1a; npm5.2以后&#xff0c;安装node会自动安装npm和npx 2、安装webpack npm install -g webpack3、安装create-react-app npm install -g create-react-app二、创建react项目 1、初…

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;可以看到是否使用了索引&#xff0c;今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…

GDPU 数据结构 天码行空5

一、实验目的 1&#xff0e;掌握队列的顺序存储结构 2&#xff0e;掌握队列先进先出运算原则在解决实际问题中的应用 二、实验内容 仿照教材顺序循环队列的例子&#xff0c;设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括&#xff1a;初始化、入队…

开关电源芯片好坏的判断标准是什么?如何判断电源芯片的好坏?

电源芯片是电子设备的一个重要元件&#xff0c;如果电源芯片损坏&#xff0c;那么设备也将停止工作。开关电源芯片是一种电源管理器件&#xff0c;可以将输入电压转换为稳定的输出电压。为了开关电源芯片可以正常稳定运行以及电子设备可以正常工作&#xff0c;对于电源芯片的检…

Python万圣节蝙蝠

目录 系列文章 前言 蝙蝠 程序设计 程序分析 运行结果 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…

ES6 Symbol 数据结构

1. Symbol概念以及引入原因 ES6 引入了的一种新的原始数据类型Symbol&#xff0c;表示独一无二的值。它是 JavaScript 语言的第七种数据类型&#xff0c;前六种是&#xff1a;undefined、null、布尔值&#xff08;Boolean&#xff09;、字符串&#xff08;String&#xff09;、…

【无标题】光伏逆变器的IEC62109测试,逆变器IEC62109测试项目

光伏逆变器的IEC62109测试&#xff0c;逆变器IEC62109测试项目 逆变器又称电源调整器&#xff0c;根据逆变器在光伏发电系统中的用途可分为独立型电源用和并网用二种。根据波形调制方式又可分为方波逆变器、阶梯波逆变器、正弦波逆变器和组合式三相逆变器。对于用于并网系统的…

潮玩宇宙:收藏、交流与竞技的数字乐园

最近爆火的新项目潮玩宇宙&#xff0c;想必有很多人入场了&#xff0c;代理商宣传投资147一个月回本&#xff0c;确实是现在做到了&#xff0c;现在平台一颗宝石的价格已经超过美金了&#xff0c;还有一大部分人在等待进场&#xff0c;潮玩宇宙旗下奖券世界和养猪农场已经做了有…

Docker 安装zookeeper

一、安装单机版 1、拉取镜像 docker pull zookeeper2、创建挂载目录 mkdir -p /mydata/zookeeper/{conf,data,logs}3、新建配置文件 cd /mydata/zookeeper/conf vi zoo.cfgdataDir/data dataLogDir/logs tickTime2000 initLimit10 syncLimit5 clientPort21814、单机主机启…

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

win11蓝牙默认只查看常见蓝牙设备。ESP32创建的蓝牙很有可能是看不到的。 再蓝牙设备发现一栏选择高级&#xff0c;才能查看所有蓝牙设备。 只要下面几行代码&#xff0c;就能让PC发现ESP32 #include <BLEDevice.h> // 引入相关库void setup() {BLEDevice::init("…

【系统与工具】系统环境——VMware安装系统

文章目录 0.1 安装VMware0.2 下载ubuntu镜像0.3 创建系统实例0.4 安装ubuntu0.5 实例配置项0.5.1 安装VMware tools0.5.2 修改静态IP0.5.3 ssh连接 0.6 克隆0.6.1 克隆实例生成MAC地址 0.6.2 修改静态ip0.6.3 修改主机密码名称 参考&#xff1a;https://blog.csdn.net/m0_51913…

ios safari 正则兼容问题

背景: 系统是自己开发的采购管理系统; 最近升级系统之后客户反馈部分苹果手机现在在进入单据界面的时候报错, 内容显示不全; 安卓手机正常; 苹果首页是之前有使用过系统的才不行, 如果是之前没有使用过系统, 现在也是可以; 也尝试清理过缓存,更换浏览器都也是不行; 也更…

用Python造轮子

目录 背景安装setuptools库准备要打包的代码创建setup.py文件打包生成whl文件把库装到电脑上使用这个库 背景 如何把自己写的代码&#xff0c;打包成库方便其他人使用 安装setuptools库 正所谓想要富先修路&#xff0c;先把造轮子要用的库装上 pip install wheel pip insta…

供应链 | 零售商-供应商柔性承诺契约:一种鲁棒优化方法 (二)

原文作者&#xff1a;Aharon Ben-Tal, Boaz Golany, Arkadi Nemirovski, Jean-Philippe Vial​ 引用&#xff1a;Ben-Tal, A., Golany, B. , Nemirovski, A., & Vial, J. P… (2005). Retailer-supplier flexible commitments contracts: a robust optimization approach. …

常见面试题-Redis专栏(一)

typora-copy-images-to: imgs了解 redis 中的大key吗&#xff1f;多大算是大key呢&#xff1f;如何解决&#xff1f; 答&#xff1a; redis 的大 key 指的是 key 对应的 value 所占用的内存比较大。 对于 string 类型来说&#xff0c;一般情况下超过 10KB 则认为是大 key&…

Flink学习之旅:(三)Flink源算子(数据源)

1.Flink数据源 Flink可以从各种数据源获取数据&#xff0c;然后构建DataStream 进行处理转换。source就是整个数据处理程序的输入端。 数据集合数据文件Socket数据kafka数据自定义Source 2.案例 2.1.从集合中获取数据 创建 FlinkSource_List 类&#xff0c;再创建个 Student 类…

PHP 如何查看php函数源码

一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例&#xff0c;版本为7.4 找到对应的版本进入 点击ext&#xff0c;这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…

【疯狂Java讲义】Java学习记录(使用jar命令打包)

jar命令 把多个文件打包成一个压缩包——这个压缩包和WinZip的压缩格式是一样的。 区别在于jar压缩的文件默认多一个META-INF的文件夹&#xff0c;该文件夹里包含一个MANIFEST.MF的文件&#xff08;清单&#xff09;。 通常来说&#xff0c;得到的压缩包有3种&#xff08;压缩格…