解决读取Oracle数据库US7ASCII编码乱码问题

简介: 今天和第三方对接数据时,对方提供了一个视图US7ASCII编码,给代码调试带来了很大的不便。程序输出的mybatis获取的对象及new String(s.getBytes("ISO8859-1"), "GB2312")加解密后都是乱码。

 目前的方案只针对如上情况下,对Oracle操作比较少的情况(如本例,只是对oracle一个视图的查询接口)。

解决步骤及源码:

  1. 添加TypeHandler实现
packagecom.xyjtech.yjjk.collect.dengzhoucenter.config;
importlombok.extern.slf4j.Slf4j;
importorg.apache.commons.io.IOUtils;
importorg.apache.ibatis.type.BaseTypeHandler;
importorg.apache.ibatis.type.JdbcType;
importorg.apache.ibatis.type.MappedJdbcTypes;
importorg.apache.ibatis.type.MappedTypes;
importorg.springframework.stereotype.Component;
importjava.io.IOException;
importjava.sql.CallableStatement;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
@Slf4j@Component@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
publicclassStringTypeHandlerConfigextendsBaseTypeHandler<String> {
/*** 将对请求入参进行转码(涉及的主要方法)**/@OverridepublicvoidsetNonNullParameter(PreparedStatementps, inti, Stringparameter, JdbcTypejdbcType) throwsSQLException {
parameter=StringUtil.GBKtoISO(parameter);
ps.setString(i, parameter);
    }
/*** 将返回结果转码(涉及的主要方法)** @param rs* @param columnName* @return* @throws SQLException*/@OverridepublicStringgetNullableResult(ResultSetrs, StringcolumnName) throwsSQLException {
try {
if (!"".equals(columnName) &&columnName!=null) {
log.info(columnName+"======>"+IOUtils.toString(rs.getAsciiStream(columnName), "GBK"));
returnIOUtils.toString(rs.getAsciiStream(columnName), "GBK");
            }
        } catch (IOExceptione) {
log.info("转换异常:"+e);
        }
returnrs.getString(columnName);
    }
@OverridepublicStringgetNullableResult(ResultSetrs, intcolumnIndex) throwsSQLException {
//同方法二,注意处理是getString以后的值log.info("1======>"+rs.getString(columnIndex));
try {
log.info("2======>"+IOUtils.toString(rs.getAsciiStream(columnIndex), "GBK"));
        } catch (IOExceptione) {
        }
returnrs.getString(columnIndex);
    }
@OverridepublicStringgetNullableResult(CallableStatementcs, intcolumnIndex) throwsSQLException {
//同方法二,注意处理是getString以后的值log.info("1======>"+cs.getString(columnIndex));
returncs.getString(columnIndex);
    }
}
  1. 辅助类
packagecom.xyjtech.yjjk.pt.utils;
publicclassStringUtil {
publicstaticStringISOtoGBK(Strings) {
if (s==null|| (s.trim()).equals(""))
returns;
try {
s=newString(s.getBytes("ISO8859-1"), "GB2312");
        } catch (Exceptione) {
        }
returns;
    }
publicstaticStringGBKtoISO(Strings) {
if (s==null|| (s.trim()).equals(""))
returns;
try {
s=newString(s.getBytes("GBK"), "iso-8859-1");
        } catch (Exceptione) {
        }
returns;
    }
}
  1. Mapper.xml配置
<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xyjtech.yjjk.collect.dengzhoucenter.mapper.pacs.PacsInfoMapper"><resultMapid="pacsInfoMap"type="com.xyjtech.yjjk.collect.domain.model.PacsInfoVo"><resultcolumn="PATIENT_TYPE"property="patientType"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="OUT_PATIENT_ID"property="outPatientId"/><resultcolumn="IN_PATIENT_ID"property="inPatientId"/><resultcolumn="REPORT_FORM_NO"property="reportFormno"/><resultcolumn="FULL_NAME"property="fullName"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="EXAM_SOURCE"property="examSource"/><resultcolumn="ORDER_RELEASE_TIME"property="orderReleaseTime"/><resultcolumn="EXAM_TIME"property="examTime"/><resultcolumn="EXAM_END_TIME"property="examEndTime"/><resultcolumn="EXAM_DEPT_NAME"property="examDeptName"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="EXAM_ITEM_NAME"property="examItemName"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="EXAM_REPORT_TIME"property="examReportTime"/><resultcolumn="EXAM_REPORT_RESULT"property="examReportResult"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="CONTENT"property="content"/><resultcolumn="DIAG_TIME"property="diagTime"/><resultcolumn="INSPECTION_DATA_TYPE"property="inspectionDataType"/><resultcolumn="CHECK_PART_CODE"property="checkPartCode"/><resultcolumn="CHECK_PART_NAME"property="checkPartName"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="AUTHENT_DATE"property="authentDate"/><resultcolumn="IS_ABNORMAL"property="isAbnormal"/><resultcolumn="CRITICAL_VALUE"property="criticalValue"/><resultcolumn="CRITICAL_VALUE_CONTENT"property="criticalValueContent"typeHandler="com.xyjtech.yjjk.collect.dengzhoucenter.config.StringTypeHandlerConfig"/><resultcolumn="IMAGE_SAVE_PATH"property="imageSavePath"/><resultcolumn="REPORT_IMAGE_PATH"property="reportImagePath"/><resultcolumn="REPORT_IMAGE"property="reportImage"/><resultcolumn="REPORT_TEXT"property="reportText"/><resultcolumn="EXAM_TYPE"property="examType"/></resultMap><selectid="getList"resultMap="pacsInfoMap">        SELECT
            *
        FROM
            EXAM_INFO A
        WHERE
            A.PATIENT_ID = #{patientId,javaType=string,jdbcType=VARCHAR}
            or A.VISIT_ID = #{visitId,javaType=string,jdbcType=VARCHAR}
            or A.IN_PATIENT_ID = #{inPatientId,javaType=string,jdbcType=VARCHAR}
            or A.OUT_PATIENT_ID = #{outPatientId,javaType=string,jdbcType=VARCHAR}
</select></mapper>



相关文章
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle RMAN的目录数据库
Oracle RMAN默认将备份元信息存储在控制文件中,但控制文件损坏或丢失会导致恢复失败,且备份增多会使控制文件无限增长。为解决这些问题,Oracle引入了RMAN目录数据库(Catalog Database),专门用于存储RMAN备份的元信息。使用目录数据库可提升备份管理效率,支持多数据库共享、长期备份历史记录存储,并可保存RMAN脚本。本文详细介绍了如何创建目录数据库、注册目标数据库及其操作步骤。
|
3月前
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。
|
5月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1126 28
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。
159 9
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回表
本文介绍了Oracle数据库中的闪回表(Flashback Table)功能,它能够将表的数据快速恢复到特定时间点或系统改变号(SCN),无需备份。文章通过实战示例详细演示了如何使用闪回表恢复数据,包括授权、创建测试表、记录时间与SCN号、删除数据、启用行移动功能、执行闪回操作以及验证恢复结果等步骤。同时,还展示了如何通过触发器禁止插入操作,并在闪回过程中处理触发器的启用问题。文末附有视频讲解,帮助读者更好地理解闪回表的使用方法。
229 10
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
224 4
|
6月前
|
Oracle 关系型数据库 网络安全
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。

热门文章

最新文章

推荐镜像

更多