解决mybatis竟然报Invalid value for getInt()的问题

目录
  • 背景
  • 场景
  • 初探
  • 再探
  • 结局

带你来看看mybatis为什么报"Invalid value for getInt()"这个错误

背景

使用mybatis遇到一个非常奇葩的问题,错误如下:

Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: Invalid value for getInt() - 'wo'

场景

还原一下当时的情况:

public interface UserMapper {
    @Results(value = {
            @Result(property = "id", column = "id", javaType = Long.class, jdbcType = JdbcType.BIGINT),
            @Result(property = "age", column = "age", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
            @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
    })
    @Select("SELECT id, name, age FROM user WHERE id = #{id}")
    User selectUser(Long id);
}

@Data
@Builder
public class User {
    private Long id;
    private Integer age;
    private String name;
}

public class MapperMain {
    public static void main(String[] args) throws Exception {
        MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8");

        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(UserMapper.class);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            System.out.println(userMapper.selectUser(1L));
        }
    }
}

数据库如下:

上面是一个很简单的例子,就是根据id选出用户的信息,运行结果如下:

User(id=1, age=2, name=3)

没有任何问题,但是我再往数据库里插入一条数据,如下:

MapperMain类中增加一行代码,如下:

System.out.println(userMapper.selectUser(2L));

运行结果如下:

User(id=1, age=2, name=3)
### Error querying database.  Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: Invalid value for getInt() - 'lh'
……

可以看出第一条查询没有问题,第二条查询就报错了

初探

其实我的直觉告诉我,是不是因为User类里字段顺序和SQL语句里select字段的顺序不一致导致的,那就来试一下吧

改一下User类里字段的顺序:

@Data
@Builder
public class User {
    private Long id;
    private String name;
    private Integer age;
}

结果如下:

User(id=1, name=3, age=2)
User(id=2, name=lh, age=3)

果不其然,直觉还是很6的

或者改一下SQL语句里select字段的顺序:

@Data
@Builder
public class User {
    private Long id;
    private Integer age;
    private String name;
}

public interface UserMapper {
    @Results(value = {
            @Result(property = "id", column = "id", javaType = Long.class, jdbcType = JdbcType.BIGINT),
            @Result(property = "age", column = "age", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
            @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
    })
    @Select("SELECT id, age, name FROM user WHERE id = #{id}")
    User selectUser(Long id);
}

以我们的直觉,结果肯定也没问题,果不其然,如下:

User(id=1, age=2, name=3)
User(id=2, age=3, name=lh)

再探

其实到上一步,问题已经解决了,可以继续干活了,但是搞不懂为什么,心里总觉得不踏实。

bugdebug开始,从下面的入口开始:

追踪到如下:

可以看出User这个类是有构造函数的,而且是包含所有字段的构造函数
利用这个构造函数创建实例的时候,参数的顺序就是SQL语句选择字段的顺序,不会根据映射关系去选择
所以就出现了类型不匹配

那我们再来看一下问什么会有一个这样的构造函数产生,直觉告诉我是@Builder这个注解

一起来看一下User编译后的结果:

public class User {
    private Long id;
    private String name;
    private Integer age;

    User(final Long id, final String name, final Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private Long id;
        private String name;
        private Integer age;

        UserBuilder() {
        }

        public User.UserBuilder id(final Long id) {
            this.id = id;
            return this;
        }

        public User.UserBuilder name(final String name) {
            this.name = name;
            return this;
        }

        public User.UserBuilder age(final Integer age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(this.id, this.name, this.age);
        }
    }
}

果然如此,UserBuilder.build()方法就是利用这个构造函数来生成的。

结局

最终解决方案就是给User类加上无参的构造函数就OK了,如下:

@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer age;
    private String name;
    private Long id;
}

字段顺序随便放,最后再执行一下:

User(age=2, name=3, id=1)
User(age=3, name=lh, id=2)

到此这篇关于mybatis竟然报"Invalid value for getInt()"的文章就介绍到这了,更多相关mybatis报Invalid value for getInt()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 引入mybatis-plus报 Invalid bound statement错误问题的解决方法

    错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再重写这些简单的sql语句,类似JPA那样. 前两天创建了一个新项目,持久层框架用的是mybatis,同时引入mybatis-plus做增强工具,项目启动后,调用接口却发现报错了,报错的提醒如下: 错误的信息显示的是 "无效的绑定语句",报错的地方正是操作sql语句的方法,从网上查了一下答案

  • MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error处理)

    错误梗概 接手了一个新任务,需要修改别人的代码.看看数据库配置 ,连连接池都没,然后引入了 druid,本来一切很顺利.后来不知道怎么回事,运行起来后总是报 "Invalid bound statement (not found) ",而且报错的都是 MybatisPlus 生成的 BaseMapper 中的方法,自己写的都能正常运行. 参考了很多其他帖子,都无果,最后弄了很久,终于搞定了,特级录之. druid 和 mybatis-plus 配置参数如下: pom.xml <d

  • 解决mybatis-plus通用mapper调用报错:Invalid bound statement

    目录 mybatis-plus通用mapper调用报错 解决方法 mybatis-plus通用mapper调用报错 使用springboot整合mybatis-plus后,调用自定义的方法正常,调用BaseMapper中自带的方法报错如下: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.rkang.enterprise.mapper.EmployeeInfoMapper.se

  • 使用mybatis-plus报错Invalid bound statement (not found)错误

    近期使用Springboot集成Mybatisplus,执行insert时一直报错,提示错误如下: Invalid bound statement (not found): xx.insert mapper继承BaseMapper: BaseMapper有insert方法如下: service调用mapper.insert(对象)报错 某度查找资料均不能解决问题,最终经查阅官方文档比对得知是缺少jar包导致.在pom.xml中引入: <dependency> <groupId>co

  • Mybatis出现ORA-00911: invalid character的解决办法

    今天在项目中,使用Mybatis对oracle数据库进行操作的时候,报出ORA-00911: invalid character的错误,检查了一下SQL,发现都书写正确啊,复制到plsql上执行也都没问题,这什么原因呢? 注意:这里说的是用navicat导出查询数据的时候报错:ORA-00911: invalid character 主要原因是这里的sql是不允许带最后的分号的,删掉就好了 在plsql等工具中写完后习惯性的打上;号,在复制时也要注意啊!! 以上所述是小编给大家介绍的Mybati

  • mybatisplus报Invalid bound statement (not found)错误的解决方法

    搭建项目时使用了mybatisplus,项目能够正常启动,但在调用mapper方法查询数据库时报Invalid bound statement (not found)错误. 以下为项目配置 pom文件 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.3.0</versio

  • 解决mybatis竟然报Invalid value for getInt()的问题

    目录 背景 场景 初探 再探 结局 带你来看看mybatis为什么报"Invalid value for getInt()"这个错误 背景 使用mybatis遇到一个非常奇葩的问题,错误如下: Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: I

  • 解决Mysql报Invalid default value for ''operate_time''错误的问题

    在数据库中执行建表语句 CREATE TABLE `sys_acl` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限id', `code` varchar(20) NOT NULL DEFAULT '' COMMENT '权限码', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '权限名称', `acl_module_id` int(11) NOT NULL DEFAULT '0' COMMEN

  • 解决MyBatis中Enum字段参数解析问题

    目录 基础Class和TypeHandler 请求参数解析问题 问题解决 基础Class和TypeHandler MyBatis操作的基本User对象结构如下: @Data @Alias(value = "user") public class User implements Serializable { private static final long serialVersionUID = -4947062488310146862L; private Long id; @NotNu

  • 解决idea启动报错javax.imageio.IIOException的问题

    idea启动报错javax.imageio.IIOException,解决点击ok打不开的问题 问题根源javax.imageio.IIOException: Can't get input stream from URL 出现该问题原因,根本原因就是因为下载了自定义idea背景图片的插件,如果你点击确定可以打开,百度有解决方案. 针对点击确定会闪退 点击确定之后出现闪退无法打开idea 1.点击确定,闪退之后 2.找到C盘的用户目录下, idea的异常都记录在这里 : 3.点击其中一个最新的文

  • 解决Mybatis在IDEA中找不到mapper映射文件的问题

    刚开始在IDEA中做用Mybatis查数据库中的数据时,报mapper映射文件找不到,害的我检查了好几次配置的路径是不是正确,但是看了好几遍都没有发现有拼写错误.(我记得以前在eclipse中这样写是没问题的) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" &qu

  • 解决Mybatis中mapper.xml文件update,delete及insert返回值问题

    最近写了几个非常简单的接口(CRUD),在单元测试的时候却出了问题,报错如下: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageListener': Unsatisfied dependency expressed through field 'reviewCheckInfoService'; nested exce

  • 解决mybatisplus插入报错argument type mismatch的问题

    今天使用argument type mismatch发现插入的时候报错 java.lang.IllegalArgumentException: argument type mismatch 从错误中看是参数的问题,想到我再实体类里面定义了几个在数据库中没有的字段,就使用了 @TableField(exist = false) 来排除掉这个字段. 再跑发现还是这个错误,后来看了下主键的@TableId默认的type是IdType.NONE,想想我们应该用自增的id就手动增加了一个 @TableId

随机推荐