3
回答
如何在model创建时将String类型的数据转码
华为云实践训练营,热门技术免费实践!>>>   

@JFinal 你好,想跟你请教个问题:

     因为我的oracle数据库字符集必须为 AMERICAN_AMERICA.US7ASCII,所以在取出String类型的字段时必须转码才能正常显示  

从数据库取出的时候需要  new String(aaa.getBytes("GB18030"),"ISO-8859-1"), 

存入数据库的时候又需要转回来new String(aaa.getBytes("ISO-8859-1"),"GB18030")

我现在想在取数 和 录入的时候,就将String类型自动完成转码,需要怎么做呢?需要修改源码吗?

ModelBuilder类中,都是以Object封装的,怎么来判断取出的数是String类型,请指教,看了几天源码了,实在找不到好的办法,不想在controller中来转,能够在model创建时就实现转码吗?

举报
阿拉锐
发帖于4年前 3回/450阅
共有3个答案 最后回答: 4年前
在 jdbcUrl 连接字符串中指定字符集,jfinal demo 项目中有例子,如: jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf-8

引用来自“JFinal”的答案

在 jdbcUrl 连接字符串中指定字符集,jfinal demo 项目中有例子,如: jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf-8

数据库是oracle,不支持url后面接参数,oracle的JDBC中,如果数据库的字符集是ZHS16GBK,则JDBC的操作不需要转码;如果是US7ASCII,则需要转码,需要在查询数据库的时候将字符集由ISO转换为GB18030,写入数据库的时候将字符集由GB18030转换为ISO.

所以才有以下转码的函数:

从数据库取出的时候需要  new String(aaa.getBytes("GB18030"),"ISO-8859-1"), 

存入数据库的时候又需要转回来new String(aaa.getBytes("ISO-8859-1"),"GB18030")

设定JDBC的字符集也还是不能完成转码,必须手动转,还请JFinal大哥帮我想想办法。

个人建议如下:
1)自建一个BaseModel继承自Model<M extends Model>
2)重写

public String getStr(String attr) {
return (String)attrs.get(attr);
}

public M set(String attr, Object value)

等方法。先做转码然后再调用基类的实现。相当于做了拦截。

3)你自己的model具体类继承自BaseModel即可。

个人愚见,希望对你有用。

--- 共有 1 条评论 ---
玛雅牛可以参考这篇文章作者的实现: http://www.oschina.net/question/109135_120320 4年前 回复
顶部