Mybatis报错ClassCastException: java.lang.String cannot be cast to java.util.Date
作者:互联网
Mybatis报错:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='createTime', mode=IN, javaType=class java.util.Date, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #17 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Date
检查发现在执行mybatis自带的方法时报错.
accountNotifyMapper.selectByPrimaryKey(tradeNo);
报错信息很明显了,类型转换失败:java.lang.String cannot be cast to java.util.Date
显是看Mapper.xml文件数据库是datetime,这里没有问题.因为没有手工写sql,所以这里即使错了也不会有问题.
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
那就因该是对象的问题.我的字段createTime中是这样的.
@ApiField("create_time") private Date createTime;
点击这个注解@ApiField发现是阿里云的注解.是String类型的,难怪错了.换成Java自带的@Column解决.
我这里用了tkmapper的通用方法.我来简单说一下原理.tkmapper替我们封装了很多方法,我们的mapper要继承其中的三个
extends BaseMapper<T>,ExampleMapper<T>,MySqlMapper<T>
BaseMapper是常规方法.selectByPrimaryKey就是常规方法.
ExampleMapper是通过Example操作增删查改
还有MysqlMapper是MySQL独有的方法.
tk.mybatis.mapper.common.base.select.SelectByPrimaryKeyMapper#selectByPrimaryKey
它的实现方式在BaseSelectProvider类,它继承了MapperTemplate模板类.
/**
* BaseSelectProvider实现类,基础方法实现类
*
* @author liuzh
*/
public class BaseSelectProvider extends MapperTemplate
tkmapper的原理都在这两个类里.
下面我们来看看selectByPrimaryKey这个方法.tk.mybatis.mapper.provider.base.BaseSelectProvider#selectByPrimaryKey.
这里分两步:
1.获取返回对象,就是Mapper里的T.设置了resultMaps为对象的字段.
ResultMap中createTime是@ApiField标注的,是String的,所以ResultMap没问题,转对象时是用private Date createTime; Date类型接收,所以报错.
2.拼装sql.
标签:lang,selectByPrimaryKey,java,String,报错,Date,null,createTime 来源: https://blog.csdn.net/u012483153/article/details/112341124