mybatis之TypeHandler,再也不怕数据库与实体类之间的数据转换问题了

mybatis查询转换实体类问题

  • TypeHandler
    • 示例(数据类型转换,解决科学计数法问题)
    • 局部自定义方式
    • 全局方式

TypeHandler

  • 类型处理器的基类,MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换;
  • 用于PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值;
  • MyBatis 内置了很多TypeHandler;

可以实现BaseTypeHandler,自定义 TypeHandler。

示例(数据类型转换,解决科学计数法问题)

通常我们在使用BigDecimal的时候,从数据库中查询出来,由于将计算机的运算方式,太大的数会被转换成科学计数法来显示
那么我们就可以借助TypeHandler来解决了,简而言之就是在数据进出数据库之前,对其进行转换
那么,这里有两种方式,一种是局部解决,一种是全局解决问题,针对不同需求场景,选择不同的方式即可。

局部自定义方式

首先需要我们自定义一个处理类来手动处理,继承BaseTypeHandler即可。

  • @MappedTypes :指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解上的配置将被忽略,例:@MappedJdbcTypes(JdbcType.INTEGER)。
  • @MappedJdbcTypes :指定与其关联的 JDBC 类型列表。 如果在jdbcType
    属性中也同时指定,则注解上的配置将被忽略。
@MappedTypes(BigDecimal.class)
public class CustomBigDecimalHandler extends BaseTypeHandler<BigDecimal> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i,BigDecimal parameter, JdbcType jdbcType) throws SQLException {ps.setBigDecimal(i, parameter);}//通过列名@Overridepublic BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException {return toPlainStringBigDecimal(rs.getBigDecimal(columnName));}//通过列索引@Overridepublic BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return toPlainStringBigDecimal(rs.getBigDecimal(columnIndex));}//针对存储过程@Overridepublic BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return toPlainStringBigDecimal(cs.getBigDecimal(columnIndex));}private BigDecimal toPlainStringBigDecimal(BigDecimal decimal) {if(decimal != null) {return new BigDecimal(decimal.toPlainString());}return null;}
}

创建实体类

@Data
@TableName(value = "wage",autoResultMap = true)
public class Wage {@TableId("ID")private String id;@TableField(value = "MONEY",typeHandler = CustomBigDecimalHandler.class)private String money;}

当然,这样注解方式只适合你使用mybatis-plus自带的查询,如果是xml写的语句,那么你需要这样做即可;

<!--查询  -->
<resultMap id="wageMapperResultMap" type="org.spring.springboot.entity.Wage"><result column="id" jdbcType="INTEGER" property="id"></result><result column="money" jdbcType="Decimal" property="MONEY" typeHandler="org.spring.springboot.config.CustomBigDecimalHandler"></result></resultMap>
<select id="selectWageById" resultMap="wageMapperResultMap">select * from Wage where id = #{id}</select><!--插入  --><insert id="insertWage" parameterType="org.spring.springboot.entity.Wage"> insert into student (id,name,course,score)  values<foreach collection="list" item="wage" separator=",">(#{student.id},#{wage.money,typeHandler=org.spring.springboot.config.CustomBigDecimalHandler}) </foreach></insert>

全局方式

如果你想针对某个类型的字段进行处理且全局生效,那么也有就几种方式:

  • 配置类
@Slf4j
@Configuration
@ComponentScan("boot")
@MapperScan(basePackages = {"boot.*.mapper", "boot.mapper"})
public class MybatisPlusConfig {
@Bean(name = "sqlSessionFactorySystem")public SqlSessionFactory sqlSessionFactoryOne(@Qualifier("dataSourceSystem") DataSource dataSource) throws Exception {return createSqlSessionFactory(dataSource);}
public SqlSessionFactory createSqlSessionFactory(DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();//全局配置//GlobalConfig globalConfig = new GlobalConfig();//配置填充器//globalConfig.setMetaObjectHandler(new MybatisPlusMetaObjectHandler());//bean.setGlobalConfig(globalConfig);bean.setTypeHandlers(new CustomBigDecimalHandler());return bean.getObject();}
}
  • xml配置
    在mybatis-config.xml配置指定的typeHandler类
<configuration><typeHandlers><typeHandler handler="com.xxx.typehandler.CustomBigDecimalHandler"/></typeHandlers>
</configuration>
  • 配置文件
    这种网上有的说可以,但我的项目试了,但是不管用,不知道原因。
mybatis-plus:type-handlers-package: jnpf.config

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

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

相关文章

2024,5G-A风起,中兴通讯破浪

对于通信圈而言&#xff0c;2024年最关键的里程碑&#xff0c;当属3GPP R18版本即将冻结。作为5G国际标准化组织&#xff0c;3GPP的意义是推动成员公司、工作组和技术规范的研究&#xff0c;让5G发展更有章法。 放眼整个5G技术的演进&#xff0c;其实大致分为两个阶段。第一阶段…

圆中点算法

中心在原点&#xff0c;半径为 R 的圆的隐式函数方程为 F ( x , y ) x 2 y 2 − R 2 0 F(x, y) x^2 y^2 - R^2 0 F(x,y)x2y2−R20 把像素上的点的坐标代入上述隐式方程 八分法画圆算法 利用坐标轴和与坐标轴夹角 45 度的直线 原理 假设圆弧起点 x 0 x0 x0&#xff0…

ImageProcessing,ComputerVision,DeepLearning中的名词

深度学习,机器学习里有很多名词,它们分别代表什么呢?如下: CV/DL: Computer Vision/Deep Learning 计算机视觉 / 深度学习ML:Machine Learning 机器学习AI: Artificial Intelligence 人工智能ANNs:Artificial Neureal Networks 人工神经网络NN:Neural Network 神经网络…

数模学习02-Matlab基础知识入门

先把matlab下载好。然后你就会发现电脑有少了几十个GB。服啦~ 修改字体 字体真的是太小了&#xff0c;其实我无论是使用什么编辑器我一般都会先改字体&#xff0c;字体在开始中有一个预设&#xff0c;可以修改字体&#xff0c;这样眼睛看着也会舒服一点 命令行窗口的使用 这…

DevOps(开发运维)常用的工具

"DevOps"是"Development"&#xff08;开发&#xff09;和"Operations"&#xff08;运维&#xff09;两个术语的组合&#xff0c;旨在代表公司应用开发和IT运维团队执行的任务的协作或共享方法。 DevOps描述了采用迭代软件开发、自动化以及可编程…

C语言中的联合体的由来和存储

一、联合体的由来 1.1. 数据类型的不足 C语言中&#xff0c;基本数据类型只有整型、字符型、浮点型等少数几种&#xff0c;无法满足复杂数据类型的需要。 1.2. 数组的限制 虽然数组可以存储多个同类型的数据&#xff0c;但是数组中的元素个数是固定的&#xff0c;无法动态地…

大数据Doris(四十二):使用物化视图

文章目录 使用物化视图 一、​​​​​​​创建物化视图

【负载均衡oj】(四) 运行模块

一.目的 主要负责运行可执行程序。通过文件名就能运行程序。 二.runner run运行模块: 不需要关心运行结果是否正确&#xff0c;只具备基本运行功能并只关心是否运行出错。 一个程序的时候&#xff0c;有三种IO需要关心&#xff0c;标准错误&#xff0c;标准输出&#xff0c…

esp32cam和arduino连接百度云AI识别文字接口识别图片文字

要使用esp32cam和arduino连接百度云AI识别文字接口识别图片文字并将结果打印到串口&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;你需要注册百度云AI平台账号并创建一个文字识别应用。获取到应用的API Key和Secret Key。 在Arduino IDE中安装ESP32和ESP32…

Kubernetes调试终极武器: K8sGPT

K8sGPT结合了GPT的AI能力&#xff0c;为智能化分析和运维Kubernetes集群提供了开箱即用的解决方案。原文: K8s Tools — K8sGPT[1] 随着人工智能和机器学习技术的进步&#xff0c;企业和组织越来越多的探索创新战略&#xff0c;以求利用这些能力来获得竞争优势。 K8sGPT[2]就是…

vue3+luckyexcel+php在线编辑excel文件

开发过程中&#xff0c;需要开发一个在线编辑excel文档的功能&#xff0c;找到了这个合适的组件 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 可以导入文档&#xff0c;预览、编辑、保存、导出等功能&#xff0c;可以满…

Abductive Logical Reasoning on Knowledge Graphs

Q: 这篇论文试图解决什么问题&#xff1f; A: 这篇论文试图解决在知识图谱&#xff08;Knowledge Graphs, KGs&#xff09;上进行反推逻辑推理&#xff08;Abductive Logical Reasoning&#xff09;的问题。具体来说&#xff0c;论文提出了一个任务&#xff1a;给定一组实体的…

去水印软件哪个好用?用他们就够了

随着数字媒体的发展&#xff0c;越来越多的人开始需要处理带有水印的图片或视频。水印不仅是一种版权保护手段&#xff0c;也常常被用来标记图片或视频的来源。然而&#xff0c;在某些情况下&#xff0c;我们可能需要去除水印以实现更好的使用效果。那么&#xff0c;去水印软件…

机器学习之BP神经网络精讲(Backpropagation Neural Network(附案例代码))

概念 BP神经网络(Backpropagation Neural Network)是一种常见的人工神经网络,它通过反向传播算法来训练网络,调整连接权重以最小化预测输出与实际输出之间的误差。这种网络结构包含输入层、隐藏层和输出层,使用梯度下降算法来优化权重。 结构: BP神经网络(Backpropag…

PCB丝印设计的要求和注意事项有哪些呢?

丝印设计是PCB设计中必不可少的因素&#xff0c;PCB板上丝印通常包括&#xff1a;元器件丝印及位号、板名、版本号、防静电标识、条码丝印、公司LOGO及其他一些标识。接下来&#xff0c;让我们一起看看PCB设计中对于丝印设计的要求。 一、丝印设计要求 丝印字符的字高和字宽之…

使用克魔助手查看IOS游戏FPS的方法详解

查看IOS游戏FPS 摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率&#xff08;FPS&#xff09;。通过克魔助手&#xff0c;开发者可以轻松监测游戏性能&#xff0c;以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中&#xff0c;了解游戏的帧率对于优化…

C++游戏引擎中骨骼动画和顶点动画

一.帧/帧时刻 在常见的FPS游戏中,人物的行走,物体的变形等等都是采用动画的方式实现.计算机2D屏幕采用扫描周期的方式定时刷新渲染管线,C程序通过定义帧/帧时刻实现每一帧的渲染,不同的帧衔接起来便是一个完整的动画. Direct3D提供API实现2D屏幕的重绘: D3DDevice->Clear(0,…

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型&#xff0c;它的主要目标是确保数据的准确性和一致性&#xff0c;防止未授权的修改和破坏。在这个模型中&#…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍&#xff1a; SpreadJS 基于 HTML5 标准&#xff0c;支持跨平台开发和集成&#xff0c;支持所有主流浏览器&#xff0c;无需预装任何插件或第三方组件&#xff0c;以原生的方式嵌入各类应用&#xff0c;可以与各类后端技术框架相结合。SpreadJS 以 纯前…

优化axios封装之配置使用AbortController取消重复请求 防止用户频繁操作调用接口

当数据量过大请求缓慢时用户点击按钮或者tab标签页快速重复调用同一个请求时&#xff0c;会导致数据错乱&#xff0c;当只需要最新的请求数据&#xff0c;并且中断上一个重复请求时&#xff0c;可以利用axios的CancelToken去中断之前的请求。 ps:由于不是所有请求都需要这个逻辑…