iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >MybatisPlus字段类型转换如何实现
  • 156
分享到

MybatisPlus字段类型转换如何实现

2023-07-05 12:07:33 156人浏览 八月长安
摘要

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

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

resultMap的作用是什么

在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap

MybatisPlus字段类型转换如何实现

对每个字段都有自己的定义都有两个类型
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<User> {    @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<User> 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<String> jsonArr;}

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

自动映射

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

@TableName(autoResultMap = true)

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

MybatisPlus字段类型转换如何实现

例如

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

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

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

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

MybatisPlus字段类型转换如何实现

以及通过@ResultMap标签进行引用

MybatisPlus字段类型转换如何实现

@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 id="insert" parameterType="com.imtech.yasha.sp.common.mapper.dto.sp.ZbLabourBidAuctionList" >    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})    </insert>

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

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

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

MybatisPlus字段类型转换如何实现

读到这里,这篇“MybatisPlus字段类型转换如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: MybatisPlus字段类型转换如何实现

本文链接: https://www.lsjlt.com/news/351746.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MybatisPlus字段类型转换如何实现
    本文小编为大家详细介绍“MybatisPlus字段类型转换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MybatisPlus字段类型转换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。resul...
    99+
    2023-07-05
  • MybatisPlus字段类型转换的实现示例
    目录resultMap的作用是什么mybatisPlus如何完成字段映射自动映射@TableField是能够指定jdbcType的mybatis如何完成查询参数转换先来回忆下在myb...
    99+
    2023-03-15
    MybatisPlus 字段类型转换 MybatisPlus 类型转换
  • MybatisPlus如何完成字段类型转换
    先来回忆下在mybatis中的resultMap作用和是什么 resultMap的作用是什么 在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap 对每个字段都有自己的定义都有两个类型 javaType可以不显...
    99+
    2023-08-16
    mybatis java 开发语言
  • MyBatisPlus TypeHandler自定义字段类型转换Handler
    目录前言一、思考二、解决方式2.1、TypeHandler源码2.2、BaseTypeHandler 源码2.3、BigIntegerTypeHandler 源码中的实现类2.4、尝...
    99+
    2022-11-13
    MyBatisPlus字段类型转换 MyBatisPlus TypeHandler
  • golang 字段类型转换
    Golang 字段类型转换在 Golang 中,变量的类型是比较严格的,这也是 Golang 语言设计出色的原因之一。但在实际的编程场景中,我们会遇到不同类型的值之间需要转换的情况。因此,了解 Golang 中的类型转换是很重要的。在 Go...
    99+
    2023-05-14
  • java如何实现类型转换与强制类型转换
    这篇文章主要介绍了java如何实现类型转换与强制类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java类型转换与强制类型转换如果你以前有编程经验,那么你已经知道把一种...
    99+
    2023-06-03
  • javascript如何实现类型转换
    这篇文章给大家分享的是有关javascript如何实现类型转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法:1、使用“+”运算符自动进行转换。2、使用JS内置的函数进行转换,例toString()和Stri...
    99+
    2023-06-14
  • MySQL如何实现类型转换
    这篇文章主要介绍了MySQL如何实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类型转换命令: CAST(expr AS type...
    99+
    2024-04-02
  • 如何将 MySQL 表字段类型从 BLOB 转换为 JSON?
    简介 如果 MySQL 中有一个包含 BLOB 字段的表,您希望将其转换为 JSON 字段,则可以通过执行一系列 ALTER TABLE 语句来完成。该过程包括创建具有所需数据类型 (JSON) 的新列、将数据从旧列复制到新列、删除旧列以及...
    99+
    2023-10-22
  • Laravel如何实现时间戳字段自动转换Carbon类
    这篇文章将为大家详细讲解有关Laravel如何实现时间戳字段自动转换Carbon类,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。时间戳字段自动转换 Carbon 类最后一个技巧,但更像是一个提醒,因为您应...
    99+
    2023-06-27
  • php image类型如何实现转换
    本篇内容主要讲解“php image类型如何实现转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php image类型如何实现转换”吧!php image类型实现转换的方法:1、创建一个PHP...
    99+
    2023-06-22
  • JavaScript如何实现HTML字段转换函数
    这篇文章给大家分享的是有关JavaScript如何实现HTML字段转换函数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。HTML字段转换函数function  ...
    99+
    2024-04-02
  • php如何实现字符串类型数字转数字类型
    这篇文章主要为大家展示了“php如何实现字符串类型数字转数字类型”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何实现字符串类型数字转数字类型”这篇文章吧...
    99+
    2024-04-02
  • js如何实现类型强制转换
    这篇文章主要介绍js如何实现类型强制转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!类型强制转换1 string强制转换为数字可以用*1来转化为数字(实际上是调用.valueOf方...
    99+
    2024-04-02
  • Python数据类型转换如何实现
    这篇文章主要介绍了Python数据类型转换如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数据类型转换如何实现文章都会有所收获,下面我们一起来看看吧。基本类型转换python3与python2...
    99+
    2023-07-04
  • mysql中怎么将字段类型转换排序
    这期内容当中小编将会给大家带来有关mysql中怎么将字段类型转换排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 表中字段server_id是varchar类型,现在...
    99+
    2024-04-02
  • mysql字段类型转换的方法是什么
    在MySQL中,可以使用CAST()或CONVERT()函数来进行字段类型转换。 使用CAST()函数: SELECT ...
    99+
    2024-04-09
    mysql
  • MybatisPlus如何实现公共字段自动赋值
    这篇文章主要讲解了“MybatisPlus如何实现公共字段自动赋值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MybatisPlus如何实现公共字段自动赋值”吧!1 mybatis-plu...
    99+
    2023-07-02
  • 【mongo】mongo 字段类型互转
    mark一下 参考: https://blog.csdn.net/laoyang360/article/details/72594344 1.str转long 当int很长时 ...
    99+
    2024-04-02
  • mysql如何将值转换数字类型
    本篇内容介绍了“mysql如何将值转换数字类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作