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

  也许大家也遇到过数据库的字符集和程序的字符集不一致而导致查询出来或者更新插入的中文数据是乱码的问题。
我们项目使用的是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进行编码处理了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
淘客帝国V5.22稳定版,符合淘宝搜索新规范,优化网站设置。 本程序后台全部功能完全本地化! 请及时注意官方最新更新包 官方演示地址: http://www.cnmysoft.com/taodi 官方演示后台:http://www.cnmysoft.com/taodi/admin/ (用户名:admin 密码:admin) 淘客帝国专业版基础功能: 商品标题植入:(用户可以自定义商品标题 前 中 后 缀) 标题同义词替换 (商品标题可通过设置替换同义词) 商品标题扰乱: (商品标题加强扰乱功能,列表,商品页都是相同的标题) 内容同义词替换: (商品详细页内容同义词替换,加强内容原创性) 超级淘宝嵌入:可以直接截取淘宝推广页面嵌入网站,增加吸引效果。 基本参数配置:配置App,PID,站长联系信息,beian信息,统计代码,更改管理员密码等! 友情链接管理:后台即可增添或删除前台友情链接。 设置缓存开关:用户可自己选择开启或关闭缓存功能,以及过期时间,自动删除过期的缓存! 后台配置分类:可自定义导航以及左栏分类,填写分类名称和对应分类ID即可! 蜘蛛屏蔽功能:可以选择禁用一些蜘蛛。 伪原创产品页:可以设置产品页伪原创参数 批量删除缓存:后台也可以手动批量删除缓存功能,无需在用FTP删除! 模板风格切换:后台模板风格切换,官方提供近10套各种模板! 后台广告管理:后台可以对网站的广告位进行管理 首页综合配置:配置首页的广告,店铺,商品等! 静态开关功能:后台伪静态功能选择开启或关闭! 自定义伪静态:可以自定义伪静态页面地址格式。动态生产规则文件,个性化网址显示。 商品佣金范围:整站佣金范围和信誉范围自定义! 地区条件限制:限制地区调用,可以调用单个地区。 App Key轮换功能:当一个App Key超频则自动切换到下一个App Key有效解决因API调用频率不够而无法调取到商品数据的情况! 其他高级功能:更多功能不再细致描述! 【V5.22更新内容】 处理淘宝新的修改问题,去除站内搜索改成进入淘宝搜索。 配置中心里顺序调整都不能及时同步到本地的BUG修复。 配置中心里增加新配置:页面和窗口设置。 喜庆红模板处理友情链接太多会失效的问题。 全站打开新窗口的设置,以及搜索开新窗口的设置。 搜索栏默认类别设置错误修复。 处理API调用失败重新刷新又正常了的问题 api商品 下架的商品,增加设置返回404或者是商品推荐列表 重新整理所有图片的alt属性,确保每个图片都有。 特约导购栏目部分连接失效的问题解决。 调整API调用判断,加强调用稳定性 调用文章时不调用织梦回收站里的文章。 discuz7.2未审核帖子也会调出来的问题处理。 伪静态开关统一放到自定义伪静态栏目里。 (注意:)↓↓↓↓↓↓↓↓↓↓ 上传程序或者升级都必须使用2进制模式上传程序 【运行环境】 1:Windows 平台:IIS/Apache + PHP(V5.1以上) 2:Linux/Unix 平台:Apache + PHP(V5.1以上)
在MyBatis中,你可以使用自定义类型处理器(TypeHandler)来处理自定义的Map类型类型处理器用于在Java对象和数据库字段之间进行转换。 以下是一种实现自定义类型处理器处理自定义的Map的示例: 1. 定义一个自定义的Map类型,例如`CustomMap`: ```java public class CustomMap extends HashMap<String, Object> { // 添加自定义的方法或属性 } ``` 2. 实现一个自定义类型处理器,继承自`org.apache.ibatis.type.BaseTypeHandler`类,并实现对应的方法。 ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class CustomMapTypeHandler extends BaseTypeHandler<CustomMap> { @Override public void setNonNullParameter(PreparedStatement ps, int i, CustomMap parameter, JdbcType jdbcType) throws SQLException { // 将CustomMap转换为需要的数据类型,并设置到PreparedStatement中 // ps.setXXX(i, convertedValue); } @Override public CustomMap getNullableResult(ResultSet rs, String columnName) throws SQLException { // 从ResultSet中获取指定列名的值,并将其转换为CustomMap类型 // Object columnValue = rs.getXXX(columnName); // CustomMap map = convertToCustomMap(columnValue); // return map; return null; } @Override public CustomMap getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // 与上面类似,只是根据列索引获取值 return null; } @Override public CustomMap getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // 与上面类似,只是在CallableStatement中获取值 return null; } } ``` 在上述示例中,我们继承了`BaseTypeHandler`类,并重写了父类的方法,在这些方法中进行了自定义类型的转换逻辑。 3. 在MyBatis的配置文件中,注册自定义类型处理器。 ```xml <typeHandlers> <typeHandler handler="com.example.CustomMapTypeHandler"/> </typeHandlers> ``` 通过以上步骤,你就可以使用自定义的Map类型,并通过自定义类型处理器来处理该类型的转换逻辑。在数据库操作时,MyBatis会自动调用类型处理器来进行转换。你可以根据实际需求,在类型处理器中编写相应的转换逻辑,将自定义的Map类型数据库字段进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值