Mybaits:数据库查询类型不匹配,java.sql.SQLDataException: Cannot determine value type from string

这篇具有很好参考价值的文章主要介绍了Mybaits:数据库查询类型不匹配,java.sql.SQLDataException: Cannot determine value type from string。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.问题描述

二.源码分析

三.总结


一.问题描述

事情的起因是用MybaitsPlus查询数据库过程中,查询结果与要封装的实体类字段类型对应不上,类似这样:

数据库查询结果:

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

java实体类:

@TableName("my_user")
@ToString
public class User {

    private Long id;

    private String name;

    private BigDecimal age;

    public User(String name,BigDecimal age){
        this.name=name;
        this.age=age;
    }
}

字段名字和实体类的名字类型都能对应上,但最后的查询结果却会报错java.sql.SQLDataException: Cannot determine value type from string

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

意思就是String类型的‘zhang’没有对应的类型实体类字段,这就很奇怪了,经过排查,是因为加了有参构造器,有参构造器去掉或者加上注解@NoArgConstructor就可以解决问题,不想看原因的可以直接跳到后面看结论

二.源码分析

根据报错信息找到了Mybatis中DefaultResultSetHandler这个类的createResultObject方法,这是创建返回的实体类的方法

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

这里我们看到已经拿到了实体类的Class对象,并且走到了createByConstructorSignature方法,这个方法顾名思义就是通过构造器来创建对象,我们再进这个方法看看

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

这个方法会拿到一个defaultConstructor默认构造器,那这个defaultConstructor又是从哪里来的呢,点进去findDefaultConstructor方法看一下

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

这个方法里也很简单,如果只有一个构造器就返回这个构造器,User类只有一个构造器,返回的就是(String,Bigdecimal)的构造器,回到createByConstructorSignature这个方法中,接下来就会进入createUsingConstructor这个方法中

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

这个方法会通过for循环把构造器中的参数和查询出的结果一一对应,并添加到constructorArgs中,最后通过objectFactory.create(resultType, constructorArgTypes, constructorArgs)这个方法来用这个构造器反射生成实力对象。可以看到第一个参数就出问题了,构造器中第一个参数是String类型,而查询出来的第一个字段id应该是Long类型的,显然对应不上

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

查询出来的id为String类型的1234,而到第二个参数就会变成BigDecimal类型去对应String类型的name,这无法转换就会报错

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

那如果去掉有参的构造器呢,去掉之后实体类里就只会剩下空参的构造器,再执行到createResultObject方法时,我们就可以看到执行到metaType.hasDefaultConstructor()这个方法时返回的是true,而defaultConstructor就是空参构造器,所以进入的是objectFactory.create(resultType)这个方法,这个方法里会通过这个空参的构造器来反射生成一个对象,后续再通过反射给这个对象赋值

cannot determine value type from string '2023-12-21 11:35:04,java,数据库,java,开发语言,mybatis

三.总结

在mybatis中,用于承接sql执行结果的实体类最好要有一个空参构造器,否则很可能出现类型对应不上的问题,因为Mybaits会优先用空参构造器来反射生成对象,如果没有空参构造器则会用有参的构造器,这时候查询的返回结果必须和构造器的参数一一对应,而且因为是Mybatis框架的原因,所有数据库都有可能出现这个情况,只是抛出的提示会有所不同,值得注意的是如果用了@Bulider这个注解编译后会生成一个全参的构造器,需要注意文章来源地址https://www.toymoban.com/news/detail-772444.html

到了这里,关于Mybaits:数据库查询类型不匹配,java.sql.SQLDataException: Cannot determine value type from string的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库SQL查询相关练习

    1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。 8、列出所有姓刘的职工

    2024年01月25日
    浏览(41)
  • 【数据库】日常使用PL/SQL 登录ORACLE 数据库查询数据

    一、PL/SQL 登录方式 username: ##访问数据库的账号 password: ##访问数据库的密码 Databse: ##数据库IP地址/实例名 数据库集群心跳地址/实例名 Connect as : ##Normal,如果使用sysdba账户登录选择SYSDBA 二、PL/SQL使用SQL语句查询 点击上方导航栏,New,选择SQL Window,即可再次输入要查询的

    2024年02月19日
    浏览(63)
  • 数据库 SQL高级查询语句:聚合查询,多表查询,连接查询

    创建Students和Courses表 直接查询 设置别名查询 设置条件查询 使用COUNT(*) 和 COUNT(StudentID)是一样的效果,因为StudentID是主键,每行记录的主键都不同。另外我们在聚合查询中还是能使用WHERE子句的,比如我们要 查找年龄大于20岁的学生数量 ,可使用以下SQL语句: 函数 说明 SUM

    2024年02月09日
    浏览(110)
  • 《数据库原理》实验六 SQL数据查询实验

    本系列传送门: 实验二 SQL Server SSMS工具创建和管理数据库及数据表 实验三 SQL Server SSMS工具添加数据 实验四 SQL的数据定义语句 实验五 数据库完整性约束的实现与验证 实验六 SQL数据查询实验 实验六(2) SQL数据查询—连接查询 实验七 SQL的数据更新和视图 实验八 T_SQL编程

    2024年02月03日
    浏览(94)
  • SQL Server数据库 -- 表的基础查询

    一、单表查询基本结构 二、单表查询结构语法 select 聚合函数 where 模糊查询 order by group by having 三、多表查询基本结构 四、多表查询结构语法 内连接 自连接 外连接 五、总结         学习了数据库,在以后公司等地方,你可能不会用到创建数据库或者表格,但是你一定会使

    2024年02月11日
    浏览(81)
  • SQL Server数据库 -- 表的高级查询

      一、子查询 嵌套子查询 相关子查询 二、查询运算 并运算union 交运算intersect 差运算except 三、函数的使用 if语句 while语句 case语句 四、总结 高级子查询是对查询更灵活的运用,学会了高级查询将对数据库使用有很大的帮助。       在SQL语言中,一个select-from-where语句称为一

    2024年02月13日
    浏览(44)
  • WordPress必备数据库SQL查询语句整理

    最近明月给博客和主站都部署了SSL证书,彻彻底底的加入了HTTPS站点行列。这个期间也用到了SQL查询语句来批量的对内链的HTTP前缀做替换,就感觉掌握一些SQL方面的语句还是非常有必要的,这不在【俄语译客】博客上就发现了几条比较实用的,适合 WordPress 实用的SQL语句。于

    2024年02月01日
    浏览(96)
  • SQL数据库的查询操作大全(select)

    1、数据库的连接、创建 2、对字段的操作:(alter table) 3、对数据的操作(插入、修改、删除) 4、数据查询(select) 5、多表查询(join on) 6、约束操作 四、数据库查询大全(select) 1、select 字段名 from 表; 2、In查询:用于 过滤 你所需要查询的内容                

    2023年04月08日
    浏览(66)
  • DB(一):数据库概述、SQL概述、Oracle数据类型

    包括Oracle、DB2、SQL Server、MySQL数据库概述;数据定义语言DDL、数据操作语言DML、事务控制语言TCL、数据查询语言DQL、数据控制语言DCL语言介绍;NUMBER 、CHAR、VARCHAR2、DATE数据库类型;CHAR和VARCHAR2的存储编码、CHAR和VARCHAR2的最大长度、LONG和CLOB类型。 1、DB和DBMS (1)、数据库(

    2024年02月09日
    浏览(65)
  • 第44章 SQL 用于各种数据库的数据类型教程

    Microsoft Access、MySQL 和 SQL Server 所使用的数据类型和范围。 数据类型 描述 存储 Text 用于文本或文本与数字的组合。最多 255 个字符。 Memo Memo 用于更大数量的文本。最多存储 65,536 个字符。 注释: 无法对 memo 字段进行排序。不过它们是可搜索的。 Byte 允许 0 到 255 的数字。

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包