咱就是说,这个问题遇到的确实不多,百度尝试了很多方法,对于我的项目来说,都不太完整,然后不断尝试不断试错,终于让俺解决了,上图!
如果报以下错误,就是因为数据库类型与实体类类型无法匹配
无效的列类型: getString not implemented for class oracle.jdbc.driver.T4CBlobAccessor; nested exception is java.sql.SQLException: 无效的列类型: getString not implemented for class oracle.jdbc.driver.T4CBlobAccessor] with root cause
解决办法
1.在Mapper.xml中定义resuleMap
<resultMap id="hbLicenseSyncResult" type="com.baidu.entity.LicenseSync">
<result property="dataUpUuid" column="DATA_UP_UUID" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="licenseFileNumbe" column="LICENSE_FILE_NUMBE" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="catalogId" column="CATALOG_ID" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="templateId" column="TEMPLATE_ID" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="category" column="CATEGORY" javaType="BigDecimal" jdbcType="NUMERIC" />
<result property="licenseName" column="LICENSE_NAME" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="issueUnit" column="ISSUE_UNIT" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="issueUnitname" column="ISSUE_UNITNAME" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="areaCode" column="AREA_CODE" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="licenceTypeCode" column="LICENCE_TYPE_CODE" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="licenseNumber" column="LICENSE_NUMBER" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="issueDate" column="ISSUE_DATE" javaType="Date" jdbcType="TIMESTAMP"/>
<result property="validTimeBegin" column="VALID_TIME_BEGIN" javaType="Date" jdbcType="TIMESTAMP"/>
<result property="validTimeEnd" column="VALID_TIME_END" javaType="Date" jdbcType="TIMESTAMP" />
<result property="holder" column="HOLDER" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result property="holderCode" column="HOLDER_CODE" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="whose" column="WHOSE" javaType="BigDecimal" jdbcType="NUMERIC"/>
<result property="state" column="STATE" javaType="BigDecimal" jdbcType="NUMERIC"/>
<result property="newAddMetada" column="NEW_ADD_METADA" javaType="java.lang.String" jdbcType="CLOB" />
<result property="licenseFile" column="LICENSE_FILE" javaType="java.lang.String" jdbcType="BLOB" typeHandler="com.baidu.certificate.handler.StringBlobTypeHandler" />
<result property="fileType" column="FILE_TYPE" javaType="BigDecimal" jdbcType="NUMERIC"/>
<result property="licenseBaseImage" column="LICENSE_BASE_IMAGE" javaType="java.lang.String" jdbcType="BLOB" typeHandler="com.baidu.certificate.handler.StringBlobTypeHandler"/>
<result property="wordInfo" column="WORD_INFO" javaType="java.lang.String" jdbcType="BLOB" typeHandler="com.baidu.certificate.handler.StringBlobTypeHandler"/>
<result property="attachment" column="ATTACHMENT" javaType="java.lang.String" jdbcType="BLOB" typeHandler="com.baidu.certificate.handler.StringBlobTypeHandler"/>
<result property="createDate" column="CREATE_DATE" javaType="Date" jdbcType="TIMESTAMP" />
<result property="licenseBaseImage" column="LICENSE_BASE_IMAGE" jdbcType="BLOB" typeHandler="com.baidu.certificate.handler.StringBlobTypeHandler" />
<result property="dataUpStatus" column="DATA_UP_STATUS" javaType="java.lang.String" jdbcType="VARCHAR" />
<result property="dataUpTime" column="DATA_UP_TIME" javaType="Date" jdbcType="TIMESTAMP"/>
<result property="projectInfo" column="PROJECT_INFO" javaType="java.lang.String" jdbcType="CLOB" />
</resultMap>
2.自定义Handler com.baidu.certificate.handler.StringBlobTypeHandler
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.*;
//对应要处理数据库字段
@MappedJdbcTypes(JdbcType.BLOB)
//pojo中对应的属性类型
@MappedTypes(String.class)
@Component
public class StringBlobTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
// 声明一个输入流对象
ByteArrayInputStream bis = null;
String param = null;
if (parameter != null) {
//这里强转是因为知道了是String类型,可以看具体情况而定
param = (String) parameter;
}
try {
// 把字符串转为字节流
bis = new ByteArrayInputStream(param.getBytes("utf-8"));
} catch (Exception e) {
throw new RuntimeException("Blob Encoding Error!");
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
throw new RuntimeException("Blob Encoding Error!");
}
}
}
ps.setBinaryStream(i, bis, param.length());
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
Blob blob = rs.getBlob(columnName);
String returnValue = null;
if (null != blob) {
returnValue = new String(blob.getBytes(1L, (int) blob.length()));
}
return returnValue;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Blob blob = rs.getBlob(columnIndex);
String returnValue = null;
if (null != blob) {
returnValue = new String(blob.getBytes(1L, (int) blob.length()));
}
return returnValue;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Blob blob = cs.getBlob(columnIndex);
String returnValue = null;
if (null != blob) {
returnValue = new String(blob.getBytes(1L, (int) blob.length()));
}
return returnValue;
}
}
@MappedJdbcTypes(JdbcType.BLOB) //定义数据库要处理的字段类型
@MappedTypes(String.class) //定义实体中对应的属性
@Component //包扫描,意义大家懂的
如果不加MappedJdbcTypes和MappedTypes 注解 最终查询及返回的数据值,都变成了地址值,原理俺没有深究
至此! 问题处理完毕