当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常

项目场景:

项目场景:当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常

初始问题描述

比如在实体中存在一个Date类型的属性date
当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常_第1张图片
在sql表中存在对应的字段
在这里插入图片描述
但是在sql表中,该数据的类型为bigInt,存储的是1970年1月1日00:00:00到目标时间的毫秒数。
当你使用mybatis将表中的数据映射到实体中时,就会出现转换异常
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'birthday' from result set. Cause: java.sql.SQLDataException: Unsupported conversion from LONG to java.sql.Timestamp

初始问题解决

1.此时我们可以使用mybatis的TypeHandler进行类型转换处理(注意!!!!!!!此时这个handler是为了将数据库中的birthday(bigInt型)转换成java实体中的birthday(util.date型))

package com.itheima.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/**
 * @author Watching
 * * @date 2022/5/11
 * * Describe:
 */
public class DateTypeHandler extends BaseTypeHandler<Date> {
    //将java类型转换成数据需要的类型
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        long time = date.getTime();
        preparedStatement.setLong(i, time);//i是参数位置
        System.out.println("setNonNullParameter将java类型转换成数据需要的类型");
    }

    //将数据库中的类型转换成java类型
    //String参数 要转换的字段名称
    //ResultSet 查询出的结果集
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
        System.out.println(s);
        long aLong = resultSet.getLong(s);
        Date date = new Date(aLong);
        System.out.println("getNullableResult将数据库中的类型转换成java类型");
        return date;
    }

    //将数据库中的类型转换成java类型
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        long aLong = resultSet.getLong(i);
        Date date = new Date(aLong);
        System.out.println("getNullableResult将数据库中的类型转换成java类型");
        return date;
    }

    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long aLong = callableStatement.getLong(i);
        Date date = new Date(aLong);
        System.out.println("getNullableResult");
        return date;
    }
}

2.并且在mybatis核心文件中注册TypeHandler

    
    <typeHandlers>
        <typeHandler handler="com.itheima.handler.DateTypeHandler"/>
    typeHandlers>

3.此时再测试就可以获得成功结果啦
在这里插入图片描述

进阶问题

如果查询的表中的某个字段对应的实体属性符合BaseTypeHandler,但是该字段在数据库中的数据类型又不是bigInt,如
当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常_第2张图片

当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常_第3张图片
数据库中的ordertime是datetime类型

此时执行查询操作就会出现新的异常
Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'ordertime' from result set. Cause: java.sql.SQLDataException: Unsupported conversion from DATETIME to java.lang.Long

为什么会出现这个异常呢? 因为我们上面的自定义TypeHandler的功能是将bigInt转换为util.Date
而此时该字段的类型为datetime

进阶问题解决:

1.将mybatis核心文件中的TypeHandler注册注释掉
在这里插入图片描述
2.在特定的字段上进行TypeHandler的注册
当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常_第4张图片

此时mybatis就只会对你指定的实体属性和字段进行转换,不会对所有符合的实体属性和字段就行转换

3.得到正确结果
当数据库中的字段类型和java实体类型不匹配时,mybatis将字段映射到实体属性上会出现一些转换异常_第5张图片

你可能感兴趣的:(java,数据库,mysql)