ibatis访问oracle数据库US7ASCII中文乱码问题

时间:2023-03-09 03:32:43
ibatis访问oracle数据库US7ASCII中文乱码问题

今天碰到一个问题,使用ibatis框架访问编码为US7ASCII的oracle数据中文乱码,

找了很久终于有了解决方案
首先 SqlMap-Config.xml按如下配置
<sqlMapConfig>

    <!--<sqlMap>元素用于包括SQL Map映射文件和其他的SQL Map配置文件。 -->
    <settings lazyLoadingEnabled="true" useStatementNamespaces="true" />
    <typeAlias type="com.jerry.spring.util.EncodingStringTypeHandlerCallback" alias="ENCODE"/>  
     <typeHandler callback="ENCODE" javaType="java.lang.String"/> 
    <sqlMap resource="com/jerry/spring/model/User_SqlMap.xml" />
    <sqlMap resource="com/jerry/spring/model/TimeRecord_SqlMap.xml" />

</sqlMapConfig>

EncodingStringTypeHandlerCallback
EncodingStringTypeHandlerCallback类继承TypeHandlerCallback接口
import java.sql.SQLException;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
public class EncodingStringTypeHandlerCallback implements TypeHandlerCallback
{
   // boolean flag = InitParam.getDbEncoding("DbEncoding");
    boolean flag = true;
    public Object getResult(ResultGetter arg0) throws SQLException {
        //西文字符集转换
        if(flag){
            return StringUtil.ISOtoGBK(arg0.getString());
        }
        return arg0.getString();
     }
     public void setParameter(ParameterSetter setter, Object arg1) throws SQLException {
        if(arg1 instanceof String)
        {
          //西文字符集转换
            if(flag){
                setter.setString(StringUtil.GBKtoISO((String)arg1));
            }
            else{
                setter.setString((String)arg1);
            }
        }
     }
     public Object valueOf(String arg0) {
         //西文字符集转换
         if(flag){
             return StringUtil.ISOtoGBK(arg0);
         }
        return arg0;
     }

}  

StringUtil 

public class StringUtil {
    public static String ISOtoGBK(String s) { 
        if (s == null || (s.trim()).equals(""))
            return s;
        try {    
            s = new String(s.getBytes("ISO8859-1"), "GB2312");    
        } catch (Exception e) {    
        }    
        return s;    
    }  
    public static String GBKtoISO(String s) {   
        if (s == null || (s.trim()).equals(""))
            return s;
        try {    
            s = new String(s.getBytes("GBK"), "iso-8859-1");    
        } catch (Exception e) {    
        }    
        return s;    
    }  
}
至此中文乱码问题顺利解决
欢饮关注个人开源代码
https://github.com/zuifengke/windy
代码在MedQCWebApp项目下