java.lang.IllegalArgumentException: Can not set xxxx field XXXX

IllegalArgumentException: 非法参数异常

产生异常的原因:

在Java与mysql交互数据时,由于定义数据类型的不一致,我们在从mysql中读取数据到Java中进行类型转换时,时常会因为数据类型的不一致而导致该异常。

解决方法:

  • 以我目前的案例为例:
    Book类对应mysql中的book表,类中定义了一个Year类型的publishYear变量
    java.lang.IllegalArgumentException: Can not set xxxx field XXXX
    mysql表中定义了一个year类型变量
    java.lang.IllegalArgumentException: Can not set xxxx field XXXX
    由于java数据类型与mysql类型的数据对应不是这两个类型,因此发生以下异常:

java.lang.IllegalArgumentException: Can not set java.time.Year field com.aluem.bean.Book.publishYear to java.sql.Date

大意为:不能将java.time.Year类型属性设置成java.sql.Date类型。

  • 解决方案
    • 通过查询java数据类型与mysql类型的数据对应类型表,得知此处应该将Book类中的publishYear属性改为Date类型。如下图:java.lang.IllegalArgumentException: Can not set xxxx field XXXX
      再次测试,成功得到数据。
      java.lang.IllegalArgumentException: Can not set xxxx field XXXX

Java数据类型和MySql数据类型对应表

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述
VARCHAR L+N VARCHAR java.lang.String 12
CHAR N CHAR java.lang.String 1
BLOB L+N BLOB java.lang.byte[] -4
TEXT 65535 VARCHAR java.lang.String -1
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4
BIT 1 BIT java.lang.Boolean -7
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5
FLOAT 4+8 FLOAT java.lang.Float 7
DOUBLE 22 DOUBLE java.lang.Double 8
DECIMAL 11 DECIMAL java.math.BigDecimal 3
BOOLEAN 1 同TINYINT
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4
DATE 10 DATE java.sql.Date 91
TIME 8 TIME java.sql.Time 92
DATETIME 19 DATETIME java.sql.Timestamp 93
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93
YEAR 4 YEAR java.sql.Date 91