今天碰到一个问题,使用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项目下