Mybatis之typeHandler

Mybatis 之typeHandler

问题

经常在项目上遇到一些Mysql的字段在基本定义类型以外的数据,比如geometry地理信息数据、列表、JSON数据等,这些数据都尝试通过一个字段存储,这时候可以用上mybatis中TypeHandler自定义数据映射。

BaseTypeHandler

BaseTypeHandler 类是 MyBatis 中用于处理数据库类型和 Java 类型之间转换的基本抽象类。它有一些方法,可以根据需要进行覆盖来实现自定义类型处理器。以下是 BaseTypeHandler 中的一些主要方法和它们的作用:

  1. setParameter 方法:

    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException

    该方法用于将 Java 对象(parameter)转换为数据库字段类型,并将转换后的值设置到 PreparedStatement 对象中的指定索引位置(i)。在这个方法中实现将 Java 对象转换为数据库字段的逻辑。jdbcType 参数指定了 JDBC 数据类型,可以根据需要进行处理。

  2. getResult、getResult 方法:

    该方法用于从 ResultSet 中获取数据库字段值,并将其转换为 Java 对象。在这个方法中实现将数据库字段值转换为 Java 对象的逻辑。通常,你会根据列名(columnName)从 ResultSet 中获取字段的值。

  3. getNullableResult、getNullableResult 方法:

    这个方法类似于 getResult 方法,但用于从 CallableStatement 中获取数据库字段值,并将其转换为 Java 对象。需要根据列名从 CallableStatement 中获取字段值。

  4. setNonNullParameter 方法:

    这个方法是 setParameter 方法的辅助方法,用于设置非空参数到 PreparedStatement 对象中时执行类型转换。如果确定参数不会为 null,可以使用这个方法来处理非空参数的情况。

转化为List数据

数据库使用字符串存储

mysql数据格式是为"1,2,3"

java中解析实体对象类型为"List"

1.自定义StringTypeHandler

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class})
public class StringTypeHandler extends BaseTypeHandler<List<String>> {private static final String DELIM = ",";@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {String value = StringUtils.collectionToDelimitedString(strings, DELIM);preparedStatement.setString(i, value);}@Overridepublic List<String> getNullableResult(ResultSet resultSet, String s) throws SQLException {String value = resultSet.getString(s);return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));}@Overridepublic List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {String value = resultSet.getString(i);return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));}@Overridepublic List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {String value = callableStatement.getString(i);return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));}
}

2.实体类


import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.type.JdbcType;import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;@Data
@TableName(value = "process", autoResultMap = true)
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ProcessEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 主键*/private String id;/*** 角色列表Ids*/@TableField(typeHandler = StringTypeHandler.class, jdbcType = JdbcType.VARCHAR)private List<String> roles;}

3.在实体类xml文件中定义实体类

<mapper namespace="com.wn.wnn.mapper.ProcessMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.wn.wnn.entity.ProcessEntity"><id column="id" property="id"/><result column="roles" property="roles"typeHandler="com.wn.wnn.mapper.ProcessMapper.type.StringTypeHandler" jdbcType="VARCHAR"/></resultMap></mapper>

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

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

相关文章

简单方法搭建个人网站

随着互联网的发展&#xff0c;越来越多的人希望拥有一个属于自己的网站&#xff0c;用来展示自己的个人才华、推广自己的产品或服务。但是&#xff0c;很多人都因为没有编程知识而望而却步。现在&#xff0c;有一个简单的方法可以帮助你轻松搭建网站&#xff0c;无需编程知识。…

大模型在百度智能问答、搜索中的应用

本文主要介绍了智能问答技术在百度搜索中的应用。包括机器问答的发展历程、生成式问答、百度搜索智能问答应用。欢迎大家加入百度搜索团队&#xff0c;共同探索智能问答技术的发展方向&#xff0c;文末有简历投递方式。 01 什么是机器问答 机器问答&#xff0c;就是让计算机…

pytest方法间变量值传递--request夹具

相当于self对象&#xff0c;因为调试的时候测试用例是类似沙箱的单步运行&#xff0c;所以self对象的属性被阻挡在沙箱外边。 request.cls 是pytest中的一个属性&#xff0c;它允许您在测试类中共享数据或属性。当您使用pytest编写测试类时&#xff0c;request 夹具允许您在测…

基于5G工业CPE打造智慧煤矿无人巡检监测应用

煤炭是我国重要的能源资源&#xff0c;对于煤炭的开采和利用也是我国重要的工业产业部分。得益于5G物联网技术的发展普及&#xff0c;煤矿场景也迎来智能化升级&#xff0c;实现了包括智能采掘、智能调度、无人运输、无人巡检等新型应用&#xff0c;极大提升了煤矿采运产业的效…

音频类型识别方案-audioset_tagging

audioset_tagging github上开源的音频识别模型&#xff0c;可以识别音频文件的类型并打分给出标签占比&#xff0c;如图 echo off set CHECKPOINT_PATH"module/Cnn14_mAP0.431.pth" set MODEL_TYPE"Cnn14" set CUDA_VISIBLE_DEVICES0 python pytorch\in…

Ubuntu系统编译调试QGIS源码保姆级教程

在之前的文章中&#xff0c;我详细介绍了怎么在Windows下编译QGIS源码&#xff0c;也得到了不错的反馈。但是不足的是Windows下只能编译QGIS的Release模式和RelWithDebInfo模式&#xff0c;想要分析源码&#xff0c;“断点调试”肯定是少不了的&#xff0c;但是这两种模式虽然也…

git 推送到github远程仓库细节处理(全网最良心)

我查看了很多网上的教程都不是很好 我们先在github创建一个仓库&#xff0c;且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…

论文写作框架示例:论软件系统建模方法及其应用

标题 前言题目要求写作框架(1)摘要(300~330字)(2)正文(2000~2500字,2200字左右为宜)(3)收尾(200字左右)前言 本章内容参考了51cto的薛老师的《软考论文高分特训与范文10篇》的内容,是帮助初学者打开写作思路的工具,而不是必须要遵循的模式。建议软考人多读多看…

2023mathorcup大数据数学建模竞赛A题坑洼道路识别67页完整高质量原创论文

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了本次mathorcup大数据数学建模竞赛A题基于计算机视觉的坑洼道路检测和识别的完整论文了。 给大家看一下目录吧&#xff1a; 摘 要&#xff1a; 10 一、问题重述 12 二&#xff0e;问题分析 13 2.1问题一 13 2.2问题…

MySQL安全基线检查

目录 安全基线检查基础知识MySQL 的安全基线检查MySQL 更严格的一些基线检查内容一、安全基线检查基础知识 1、安全基线的定义: 安全基线是一个信息系统的最小安全保证,即该信息系统最基本需要满足的安全要求。它是在安全付出成本与所能够承受的安全风险之间进行平衡的合理…

centos 8 yum源不能使用问题

问题&#xff1a;新安装的centos 8 不能使用wget就不能下载和安装其他的软件 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 解决&#xff1a; [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yu…

Ansible上jinja2模板的部署和控制语句、运算方式、部分过滤器的演示

目录 一.jinja2介绍 1.Ansible上jinja2模版简介 2.jinja2模版优点 二.template部署jinja2模板 1.示例 2.template模块参数 三.jinja2的控制语句 1.for循环 2.if判断语句 3.set设置变量 四.jinja2表达式运算和属性判断 1.比较运算 2.逻辑运算 3.算数运算 4.成员运…

Connectify Hotspot 23.0.1.40175 MAX Crack

您是学生吗&#xff1f;你在宿舍打游戏吗&#xff1f;你是在集体宿舍吗&#xff1f;如果是&#xff1a;你需要功能上网吧 Connectify Hotspot 专业 WiFi 热点共享管理工具 Connectify 是一款强大的无线热点工具&#xff0c;可以让带有无线网卡 / 3G 上网卡的电脑变成无线路由器…

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性&#xff0c;同时新增了各种文字特效&#xff0c;使网页文字更具表现力和感染力&#xff0c;丰富了网页设计效果&#xff0c;如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…

MySQL2:MySQL中一条查询SQL是如何执行的?

MySQL2&#xff1a;MySQL中一条查询SQL是如何执行的&#xff1f; MySQL中一条查询SQL是如何执行的&#xff1f;1.连接怎么查看MySQL当前有多少个连接&#xff1f;思考&#xff1a;为什么连接数是查看线程&#xff1f;客户端的连接和服务端的线程有什么关系&#xff1f;MySQL参数…

H5游戏源码分享-考眼力游戏猜猜金币在哪

H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…

cesium开发引入方式

无独有偶&#xff0c;引入无非两种方式&#xff1a;外部标签引入和import导入。 1、外部引入 外部引入的话需要提前去下载开发包&#xff0c;下载完后&#xff0c;Build文件夹有两个文件夹&#xff1a;Cesium和CesiumUnminified&#xff0c;Cesium是压缩版的&#xff0c;Cesiu…

Web入门笔记

Web入门笔记 HTTP协议 超文本传输协议 规定了浏览器和服务器之间数据传输的规则&#xff0c;请问数据和响应数据的格式 基于TCP请求-响应模式一次请求对应一次响应无状态的协议 请问数据格式 浏览器版本&#xff1a;解决浏览器兼容问题。GET请求体&#xff1a;存放请求参数…

算法|每日一题|从数量最多的堆取走礼物|最大堆

2558. 从数量最多的堆取走礼物 原题地址&#xff1a; 力扣每日一题&#xff1a;从数量最多的堆取走礼物 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。 如果不止一堆都符合礼物数量最…

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址&#xff1a;https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由…