利用ibatis的自定义类型解决中文乱码问题

来源:互联网 发布:java语言书籍推荐 知乎 编辑:程序博客网 时间:2024/05/16 04:36
  也许大家也遇到过数据库的字符集和程序的字符集不一致而导致查询出来或者更新插入的中文数据是乱码的问题。
我们项目使用的是ibatis作为data access层,对于中文数据也出现了乱码问题。一开始的想法是后台取出来的数据
或者前台保存到数据库的数据每次都手动转换编码。但是这样的方法不仅对于coding,而且对于后期数据库变换也要
改动程序,绝对不是一个很好的解决方法。
后来我的想法是希望能在ibatis那一层就把数据做自动处理,经过查看资料,发现ibatis提供了自定义类型处理器。
所以我的想法就是利用自动类型处理,把所有String类型的数据进行编码。这样的话就可以在不改动其他代码的情况
下,解决问题。
以下是类型处理器的代码:
public class EncodingStringTypeHandlerCallback implements TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter)
throws SQLException {
setter.setString(encoding((String) setter, "GB2312", "ISO-8859-1"));
}

public Object getResult(ResultGetter getter) throws SQLException {
return encoding(getter.getString(), "ISO-8859-1", "GB2312");
}

public Object valueOf(String s) {
return encoding(getter.getString(), "ISO-8859-1", "GB2312");
}

public String encoding(String s, String inputEncoding, String outputEncoding) {
if (S != null) {
return new String(s.getBytes(inputEncoding), outputEncoding);
}
return null;
}
}

    在实际应用中可以把编码集作为config文件的属性,在EncodingStringTypeHandlerCallback的静态初始块
读入其中的某两个变量中。这样的话,如果我们需要改变数据库的时候我们只需要改变config文件的编码集修改一下就可以了。
    当你把类型处理器写完的时候只要在sqlMap.xml中加上以下代码:
    <typeHandler callback="com.leo.EncodingStringTypeHandlerCallback" javaType="string"/>

    这样,我们就可以在系统运行的时候自动对所有String进行编码处理了。

原创粉丝点击