我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MybatisPlus如何完成字段类型转换

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MybatisPlus如何完成字段类型转换

先来回忆下在mybatis中的resultMap作用和是什么

resultMap的作用是什么

在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap
image.png
对每个字段都有自己的定义都有两个类型
javaType可以不显式写出来,mybatis可以根据指定的实体类推断出来
jdbcType 也就是对应到数据库中的字段类型
mybatis完成数据库的数据到java实体类型的转换这两个类型是必不可少的。会根据javaType和jdbcType去匹配到对应的处理器完成类型转换
mybatis内置了很多typeHandler在启动时注册

public TypeHandlerRegistry(Configuration configuration) {    this.unknownTypeHandler = new UnknownTypeHandler(configuration);    register(Boolean.class, new BooleanTypeHandler());    register(boolean.class, new BooleanTypeHandler());    register(JdbcType.BOOLEAN, new BooleanTypeHandler());    register(JdbcType.BIT, new BooleanTypeHandler());    register(Byte.class, new ByteTypeHandler());    register(byte.class, new ByteTypeHandler());    register(JdbcType.TINYINT, new ByteTypeHandler());    register(Short.class, new ShortTypeHandler());    register(short.class, new ShortTypeHandler());    register(JdbcType.SMALLINT, new ShortTypeHandler());    register(Integer.class, new IntegerTypeHandler());    register(int.class, new IntegerTypeHandler());    register(JdbcType.INTEGER, new IntegerTypeHandler());    register(Long.class, new LongTypeHandler());    register(long.class, new LongTypeHandler());    register(Float.class, new FloatTypeHandler());    register(float.class, new FloatTypeHandler());    register(JdbcType.FLOAT, new FloatTypeHandler());    register(Double.class, new DoubleTypeHandler());    register(double.class, new DoubleTypeHandler());    register(JdbcType.DOUBLE, new DoubleTypeHandler());    register(Reader.class, new ClobReaderTypeHandler());    register(String.class, new StringTypeHandler());    register(String.class, JdbcType.CHAR, new StringTypeHandler());    register(String.class, JdbcType.CLOB, new ClobTypeHandler());    register(String.class, JdbcType.VARCHAR, new StringTypeHandler());    register(String.class, JdbcType.LONGVARCHAR, new StringTypeHandler());    register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());    register(String.class, JdbcType.NCHAR, new NStringTypeHandler());    register(String.class, JdbcType.NCLOB, new NClobTypeHandler());    register(JdbcType.CHAR, new StringTypeHandler());    register(JdbcType.VARCHAR, new StringTypeHandler());    register(JdbcType.CLOB, new ClobTypeHandler());    register(JdbcType.LONGVARCHAR, new StringTypeHandler());    register(JdbcType.NVARCHAR, new NStringTypeHandler());    register(JdbcType.NCHAR, new NStringTypeHandler());    register(JdbcType.NCLOB, new NClobTypeHandler());    register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());    register(JdbcType.ARRAY, new ArrayTypeHandler());    register(BigInteger.class, new BigIntegerTypeHandler());    register(JdbcType.BIGINT, new LongTypeHandler());    register(BigDecimal.class, new BigDecimalTypeHandler());    register(JdbcType.REAL, new BigDecimalTypeHandler());    register(JdbcType.DECIMAL, new BigDecimalTypeHandler());    register(JdbcType.NUMERIC, new BigDecimalTypeHandler());    register(InputStream.class, new BlobInputStreamTypeHandler());    register(Byte[].class, new ByteObjectArrayTypeHandler());    register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());    register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());    register(byte[].class, new ByteArrayTypeHandler());    register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());    register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());    register(JdbcType.LONGVARBINARY, new BlobTypeHandler());    register(JdbcType.BLOB, new BlobTypeHandler());    register(Object.class, unknownTypeHandler);    register(Object.class, JdbcType.OTHER, unknownTypeHandler);    register(JdbcType.OTHER, unknownTypeHandler);    register(Date.class, new DateTypeHandler());    register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());    register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());    register(JdbcType.TIMESTAMP, new DateTypeHandler());    register(JdbcType.DATE, new DateOnlyTypeHandler());    register(JdbcType.TIME, new TimeOnlyTypeHandler());    register(java.sql.Date.class, new SqlDateTypeHandler());    register(java.sql.Time.class, new SqlTimeTypeHandler());    register(java.sql.Timestamp.class, new SqlTimestampTypeHandler());    register(String.class, JdbcType.SQLXML, new SqlxmlTypeHandler());    register(Instant.class, new InstantTypeHandler());    register(LocalDateTime.class, new LocalDateTimeTypeHandler());    register(LocalDate.class, new LocalDateTypeHandler());    register(LocalTime.class, new LocalTimeTypeHandler());    register(OffsetDateTime.class, new OffsetDateTimeTypeHandler());    register(OffsetTime.class, new OffsetTimeTypeHandler());    register(ZonedDateTime.class, new ZonedDateTimeTypeHandler());    register(Month.class, new MonthTypeHandler());    register(Year.class, new YearTypeHandler());    register(YearMonth.class, new YearMonthTypeHandler());    register(JapaneseDate.class, new JapaneseDateTypeHandler());    // issue #273    register(Character.class, new CharacterTypeHandler());    register(char.class, new CharacterTypeHandler());  }

当然我们不指定类型的话mybatis也具备自动推断类型的能力。
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#createAutomaticMappings
创建自动的字段映射根据数据库查询结果类型,和我们指定的对象字段类型做映射

mybatisPlus如何完成字段映射

当然也可以指定resultMap

@TableNam中有resultMap属性

        String resultMap() default "";
@Mapperpublic interface UserDoMapper extends BaseMapper {    @Results(            id = "userResultMap",            value = {@Result(column = "id",property = "id",javaType = Integer.class,jdbcType = JdbcType.INTEGER),                    @Result(column = "user_name",property = "userName",javaType = String.class,jdbcType = JdbcType.VARCHAR),                    @Result(column = "pass_word",property = "passWord",javaType = String.class,jdbcType = JdbcType.VARCHAR),                    @Result(column = "real_name",property = "realName",javaType = String.class,jdbcType = JdbcType.VARCHAR),                    @Result(column = "json_arr",property = "jsonArr",typeHandler = StringToJsonArrayBaseTypeHandler.class),            }    )    @Select("SELECT * FROM user ${ew.customSqlSegment}")    User searchDetail( @Param(Constants.WRAPPER) Wrapper wrapper);}
@TableName(resultMap = "userResultMap")public class User {    @TableField(jdbcType = JdbcType.INTEGER)    private Integer id;    @TableField(jdbcType = JdbcType.VARCHAR)    private String userName;    @TableField(jdbcType = JdbcType.VARCHAR)    private String passWord;    @TableField(jdbcType = JdbcType.VARCHAR)    private String realName;    @TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)    private List jsonArr;}

那么我们不想手动定义ResutMap但是又想处理一些复杂类型的转换 就可以使用autoResultMap

自动映射

我们在使用mybatisPlus时在大多数情况是不会定义resultMap的,那么mybatisPlus是如何完成字段映射的,那么答案显而易见,就是使用myabtis的字段自动创建映射的功能。
自动映射的方案有什么缺点?
1.对于复杂的类型,无法指定转换方案,无法使用自定义的类型转换器。
2.无法使用关联查询
开启autoResultMap

@TableName(autoResultMap = true)

那么mybatisPlus会根据我们的实体类的类型,为我们自动注入resultMap,注入的resultMap也会自动推断出需要使用的类型转换器当然我们也可以指定
image.png
例如

   @TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)    private List jsonArr;

也因此说,对于查询来说,mybatisPlus通过@TableField指定类型转换器,一定要开启autoResultMap才能生效了。另外mybatisPlus只会为BaseMapper中的方法生成resultMap,而我们自定义的方法,是不会生成的。
例如

@Mapperpublic interface UserDoMapper extends BaseMapper {    @Select("SELECT * FROM user ${ew.customSqlSegment}")    User searchDetail( @Param(Constants.WRAPPER) Wrapper wrapper);}

这种写法autoResultMap和指定的类型转换器是不会生效的。如果有复杂字段转换需求,需要通过@Results标签定义resultMap
例如
image.png
以及通过@ResultMap标签进行引用
image.png

@TableField是能够指定jdbcType的

不指定jdbcType时mybatis往往也能够完成自动转换,例如java中的String自然对应到数据库的VAERCHAR
在mybatis无法根据自动完成javaType到jdbcType的转换时,可以使用@TableField注解完成转换,例如我们想将一个数据库中的VARCHAR类型映射成为java中的Integer,对于插入操作时又要完成Integer到VARCHAR的转换,如果不指定jdbcType那么插入操作将会报错

   @TableField(jdbcType = JdbcType.VARCHAR)    private Integer age;

mybatis如何完成查询参数转换

前面看的是对于查询结果的转换,那么对于插入,更新,查询等操作,也有一个javaType到jdbcType的转换,对于复杂的字段类型 例如集合转json又是如何生效的?
还是先看传统mybatis定义映射的写法

    insert into zb_labour_bid_auction_list (id, uuid, uuid_t,                 creater, create_time, updater,                 update_time, item_d, item_n,                 order_no, list_no, sub_project_name,                 construction_tech, unit, project_quantity,                 unit_price, total, remark,                 supplier_no, supplier_name)    values (#{id,jdbcType=BIGINT}, #{uuid,jdbcType=VARCHAR}, #{uuidT,jdbcType=VARCHAR},             #{creater,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=VARCHAR},             #{updateTime,jdbcType=TIMESTAMP}, #{itemD,jdbcType=VARCHAR}, #{itemN,jdbcType=VARCHAR},             #{orderNo,jdbcType=VARCHAR}, #{listNo,jdbcType=VARCHAR}, #{subProjectName,jdbcType=VARCHAR},             #{constructionTech,jdbcType=VARCHAR}, #{unit,jdbcType=VARCHAR}, #{projectQuantity,jdbcType=NUMERIC},             #{unitPrice,jdbcType=NUMERIC}, #{total,jdbcType=NUMERIC}, #{remark,jdbcType=VARCHAR},             #{supplierNo,jdbcType=VARCHAR}, #{supplierName,jdbcType=VARCHAR})    

在参数上一般都会定义jdbcType,至于JavaType可以从parameterType指定的class中推断出来,这样javaTyp和jdbcType都被确定下来,很容易匹配到对应的处理器进行类型转换。
那么在mybatisPlus中显然不会为每个入参字段定义jdbcType,那么对于入参是如何进行转换的,复杂类型又是如何指定的

   @TableField(typeHandler = StringToJsonArrayBaseTypeHandler.class)    private List jsonArr;

答案也是通过@TableField指定的,而且即使关闭autoResultMap,对于查询参数的转换,指定的类型转换器和jdbcType也是会生效的。
image.png

来源地址:https://blog.csdn.net/qq_37436172/article/details/129466009

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MybatisPlus如何完成字段类型转换

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MybatisPlus如何完成字段类型转换

先来回忆下在mybatis中的resultMap作用和是什么 resultMap的作用是什么 在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap 对每个字段都有自己的定义都有两个类型 javaType可以不显
2023-08-16

MybatisPlus字段类型转换如何实现

本文小编为大家详细介绍“MybatisPlus字段类型转换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus字段类型转换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。resul
2023-07-05

MybatisPlus字段类型转换的实现示例

本文主要介绍了MybatisPlus如何完成字段类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-15

MyBatisPlus TypeHandler自定义字段类型转换Handler

这篇文章主要为大家介绍了MyBatisPlus TypeHandler自定义字段类型转换Handler示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

如何将char类型的数字字符转换成int类型问题

这篇文章主要介绍了如何将char类型的数字字符转换成int类型问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-23

如何将 MySQL 表字段类型从 BLOB 转换为 JSON?

简介如果 MySQL 中有一个包含 BLOB 字段的表,您希望将其转换为 JSON 字段,则可以通过执行一系列 ALTER TABLE 语句来完成。该过程包括创建具有所需数据类型 (JSON) 的新列、将数据从旧列复制到新列、删除旧列以及
2023-10-22

Intouch字符如何转换成整型

要将Intouch字符转换为整型,可以使用int()函数进行转换。int()函数将字符串参数解析为整数,并返回结果。以下是示例代码:```pythonintouch_char = '7'intouch_int = int(intouch_c
2023-09-21

mysql字段类型转换的方法是什么

在MySQL中,可以使用CAST()或CONVERT()函数来进行字段类型转换。使用CAST()函数:SELECT CAST(column_name AS new_data_type) FROM table_name;例如,将一个字符串类
mysql字段类型转换的方法是什么
2024-04-09

oracle中clob类型怎么转换成字符

在Oracle中,可以使用TO_CHAR函数将CLOB类型转换为字符类型。sqlSELECT TO_CHAR(clob_column) FROM your_table;上述代码中,clob_column为CLOB类型的列名,your_tab
2023-10-19

php如何将数组转换成string类型

这篇文章主要介绍了php如何将数组转换成string类型,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在php中,可以使用implode()函数来将数组转换成string类型
2023-06-14

php如何将string转换成数组类型

这篇文章主要介绍“php如何将string转换成数组类型”,在日常操作中,相信很多人在php如何将string转换成数组类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何将string转换成数组类型
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录