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.


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐