MyBatis-Plus+自定义Hanlder解决Blob类型查询及插入问题

咱就是说,这个问题遇到的确实不多,百度尝试了很多方法,对于我的项目来说,都不太完整,然后不断尝试不断试错,终于让俺解决了,上图!

如果报以下错误,就是因为数据库类型与实体类类型无法匹配

无效的列类型: 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 注解 最终查询及返回的数据值,都变成了地址值,原理俺没有深究

至此! 问题处理完毕

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus是一个基于Mybatis的增强工具,它提供了一些常用的插件来增加开发效率和功能。其中,Mybatis-plus-join是一个用于解决Mybatis-plus在多表连接查询方面的不足的工具。它能够对Mybatis-plus进行功能升级,使其能够进行多表连接查询,从而摆脱了传统的XML模式多表连接的限制。使用Mybatis-plus-join可以提高开发效率,而且使用方法与Mybatis-plus一样,学习成本较低。另外,Mybatis-plus还提供了其他常用的插件,如自动分页插件、防止全表更新与删除插件、乐观锁插件等,可以根据需要进行配置和使用。如果想要使用Mybatis-plus插件,需要在配置类或启动类中进行相应的配置,比如配置分页插件,可以通过添加PaginationInnerInterceptor来实现。具体的配置方法可以参考相关文档或示例代码。 #### 引用[.reference_title] - *1* [Mybatis-plus做连接查询的插件Mybatis-plus-join](https://blog.csdn.net/m0_67400973/article/details/126463252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MyBatis-Plus 常用插件](https://blog.csdn.net/m0_53067943/article/details/126112463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值