TypeHandler是MyBatis中用于处理Java类型与JDBC类型之间转换的接口。在SQL语句执行过程中,无论是设置参数还是获取结果集,都需要通过TypeHandler进行类型转换。MyBatis提供了丰富的内置TypeHandler实现,以支持常见的数据类型转换。同时,也可以根据需要自定义TypeHandler来处理特殊的数据类型或转换逻辑。
日常java开发中经常有这种需求,用0或者1这些代码(不局限于数字)来表示某种状态。比如用0表示女性,用1来表示男性。而且写入数据库可能是一个标识,从数据库读取又还原为具体的说明。而且一般情况下为了更好理解或者消除魔法值,通常的处理方案是定义一个枚举,有些枚举是这样定义的:
基础支持层位于MyBatis整体架构的最底层,支撑着MyBatis的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用的、独立的模块。不仅仅为MyBatis提供基础支撑,也可以在合适的场景中直接复用。
JDBC 提供的数据类型和Java的数据类型并不是完全对应的,当 Mybatis 在解析 SQL ,使用 PreparedStatement 来为 SQL 设置参数的时候,需要从 Java 类型转换为 JDBC 的类型,当从 ResultSet 中获取结果的时候,需要中 JDBC 类型转换为 Java 类型;Mybatis 的类型转换模块就是用来转换这两种数据类型的;比如在写 Mapper 文件的时候,可以有如下写法:
所有的TypeHandler都统一的注册到TypeHandlerRegistry中,其中分别保存了JdbcType对应的TypeHandler(低优先级),对象类型对应的TypeHandler(高优先级),其中最高优先级的是对象类型和JdbcType都匹配上的TypeHandler
MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下:
在MyBatis中,映射Enum枚举类是完全可行的。MyBatis提供了灵活的方式来处理Java枚举类型与数据库中的值之间的映射。
MyBatis是一个持久层框架ORM框架,实现数据库中数据和Java对象中的属性的双向映射,那么不可避免的就会碰到类型转换的问题,在PreparedStatement为SQL语句绑定参数时,需要从Java类型转换为JDBC类型,而从结果集中获取数据时,则需要从JDBC类型转换为Java类型,所以我们来看下在MyBatis中是如何实现类型的转换的。
当大家使用mybatis作为持久层框架时,在存储和查询数据时,只需要在mapper.xml文件中配置好对应字段的JdbcType和JavaType,mybatis就可以帮我们转化对应的类型。这背后是有mybatis内置的类型转换器做转换(可见源码TypeHandlerRegistry)。但是有时候,我们会对某些字段做特殊处理,比如加密和解密、状态转换、类型转换等。这个时候我们需要自定义类型转换器。
出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方。
前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文!
在使用 mybatis 进行 db 操作的时候,我们经常会干的一件事情就是将 db 中字段映射到 java bean,通常我们使用ResultMap来实现映射,通过这个标签可以指定两者的绑定关系,那么如果 java bean 中的字段类型与 db 中的不一样,应该怎么处理呢?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
后端动态列设计与实现三部曲,这是最后一步,使用java语言,结合mybatis-plus神技操作json字段。
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6963811586184052767 前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文! 一、背景 在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。 假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。 二、
今天看mybatis-plus源码发现了UpdateWrapper中的set竟然有一两个重载没有在官方文档写到:
相熟的人表现出恭而敬之的样子总是叫人感到可笑。——歌德 一般我们在实体类上指定 @TableName(autoResultMap = true) 即可使用typeHandler指定转换器,然后就可以自动转换了 例如List<XXX>的Json可以如下使用: @TableField(typeHandler = JsonListHandler.class) private List<CalcUnitEnum> calcUnits; 这里JsonListHandler如下,JacksonUtil就懒得赘述了:
文档表明,首先要加@TableName(autoResultMap = true)注解,然后再指定typeHandler
由于疫情原因,从周一开始在家办公了,个人感觉工作效率受影响还是挺大的。今天本来计划把测试用例这块写完,明后天写测试用例集这个模块,看了一下还有11个接口。
调用 XMLConfigBuilder进行解析,要进行两步操作,上篇文章中【MyBatis之启动分析(一)】有提到。
在大学写web应用的时候经常会遇到这么个问题,当我要插入一条数据,某个数据是Date类型,数据库中却是VARCHAR类型,这个时候可能会傻乎乎的先把这个数据自己手动转换成String类型再插入到数据库中,其实大可不必。MyBatis为我们提供了更好的方法即是TypeHandler来应对Java和jdbc字段类型不匹配的情况。MyBatis中内置了不少的TypeHandler,如果我们想要自己自定义一个TypeHandler可以实现TypeHandler接口,也可以继承BaseTypeHandler类。下
上一章节我们一起分析了Mybatis的Plugin模块的源码。掌握了如何配置拦截器注解,如何自定义拦截器以及拦截器的执行过程。
MyBatis Plus本身并不是一个动态的ORM,而只是在mybatis初始化的时候,为mybatis提供常用的SQL语句,resultMap设置,并不会改变MyBatis本身的行为
在进行mybatis开发的过程中,我们经常会遇到此类问题:如mysql的表中的日期为字符串,但是我们在java中希望按照Date类型进行操作。因此,我们需要用到mybatis中的typeHandler。 本文就是一个将数据库中 String类型存储的字段 createDate ,其格式为“yyyy-MM-ddHH:mm:ss”,通过TypeHandler转换为Date操作的实例。
前些日子公司打算开发一个集成各种管理功能的大平台,让我负责测试相关服务的开发。首次重任,着实让我这阵子忙成了狗。上周终于立项完成了,本周正式进入开发阶段,大致需求如下:
无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型,下表描述了一些默认的类型处理器.
全局配置: <typeHandlers> <typeHandler handler="com.gong.mybatis.typeHandler.MyEnumEmpStatusTypeHandler" javaType="com.gong.mybatis.bean.EmpStatus"/>
mybatis的核心配置之properties 创建jdbc.properties 一般在实际的项目中。数据库的连接信息。会存放在一个jdbc.properties的属性配置文件中
可以看到,使用了TypeHandler的setParameter方法来设置参数,ParameterHandler的实现相对简单。
使用mybatis plus进行sql的映射时如果是用原生的查询方法可以将json类型的字段顺利映射到对象中,可是如果是自己来写sql进行查询json数据类型映射会出现无法映射成功,基于这种情况参考了一下mp官网的说明,先记录一下
在面试中我们经常会被到MyBatis中 #{} 占位符与{}占位符的区别。大多数的小伙伴都可以脱口而出#{} 会对值进行转义,防止SQL注入。而{}则会原样输出传入值,不会对传入值做任何处理。本文将通过源码层面分析为啥#{} 可以防止SQL注入。
我们知道 mysql的类型和java类型有对应关系,参考此文:https://www.cnblogs.com/jerrylz/p/5814460.html。
1.前言 MySQL从5.7版本之后开始支持JSON数据类型,相比于JSON格式的字符串类型有如下优势:存储在JSON列中的JSON文档的会被自动验证。无效的文档会产生错误;最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。 2.背景 mybatis目前还不支持映射json的数据格式,需要我们自己进行增强 3.实现 对mybatis TypeHandler进行增强 3.1ListStringTypeHandler 核心代码 package com.xxx.xxx.pip
在Mybatis的初始化的主要工作是加载并解析mybatis-config.xml的配置文件、映射配置文件以及相关的注解信息。因为使用了建造者模式,BashBuilder抽象类即为建造者接口的角色。它的核心字段内容如下
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。 要注意 MyBatis 不会窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是哪种类型的字段, 以使其能够绑定到正确的类型处理器上。 这是因为:MyBatis 直到语句被执行才清楚数据类型。可以在这里设定:
我们经常会遇到需要传递对象的场景。有时候,我们需要将一个对象的数据传递给另一个对象进行处理,但是又不希望直接暴露对象的内部结构和实现细节。这时,我们可以使用模板模式来实现优雅的对象传递。
configuration是整个配置文件的根标签,实际上也对应着MyBatis里面最重要的配置类Configuration。 它贯穿MyBatis执行流程的每一个环节。我们打开这个类看一下,这里面有很多的属性,跟其他的子标签也能对应上。
核心代码如下(详见附件中的 handler/ArrayHandler.java):
说到轴,让我想起初中上学时老师说的话:“你那脑瓜子,咋跟手焖子似的!” 东北话手焖子就是那种冬天戴的大棉手套,棉手套里的棉花都被压的又沉又硬的了,所以来比喻脑瓜子笨。
模板设计方法存在目的在于某些算法逻辑存在一些相同处,而具体细节却不同。这样使用模板方法,可以抽取共用逻辑到父类,在子类实现具体算法细节,这样减少了重复代码。 模板方法充分运用了多态与继承。使用抽象父类定义抽象操作,然后在公共逻辑调用抽象方法。子类方法只要继承父类关注自身实现细节。
开发中可能会遇到这样的需求:比如说页面的一个N*N的表格中需要存取多个字段,如下图所示,很明显这里是需要支持动态添加的,如果此时我们建立对应的字段如插入的话,显然是一种比较麻烦的方式,所以我们可以使用在对应的实体类中添加一个List或者是JsonArray字段来表达对应的字段。如图二所示:
上一篇介绍了JDBC的相关概念、MyBatis的特性与Hibernate的区别、MyBatis的基本组件与生命周期,基本可以使用MyBatis了。
当我们谈论MyBatis自定义类型处理器时,实际上在解决一个非常有趣且实用的问题:如何在我们的Java应用程序中处理数据库中的复杂数据类型。具体来说,我们将探讨如何使用MyBatis来处理一个特殊的场景—将Java对象中的JSONObject类型属性映射到数据库中的VARCHAR类型字段。
#{et.name,typeHandler=org.dromara.streamquery.stream.plugin.mybatisplus.JsonFieldHandlerTest$JsonFieldHandler} 即可直接指定typeHandler
首先添加@TableName(autoResultMap = true)然后添加@TableField(typeHandler = DeSecondHandler.class)
由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括。本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上。下面,我们来一起看一下本篇文章的目录结构。
领取专属 10元无门槛券
手把手带您无忧上云