|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。数据|数据库数据库字符国际化是人人发问最多的成绩,比方MySQL数据库人人大概在JDBC-URL增加useUnicode=true&CharacterEncoding=GBK作为中文撑持的基础前提。但这偶然损坏了数据的完全性,假如某些人粗枝大叶,就会招致数据编码毛病,发生乱码。因而,我们必要一些手腕在程序外部举行编码处置。人们一样平常经由过程在使用上利用String(bytes:byte[],enc:String)/String.getBytes(enc:String)举行字符串编解码,如许做固然易懂,可是假如碰到年夜字段表格,手动编码时费时吃力。
我的办法:经由过程研讨JDK类库,能够感到到多层处置机制在数据处置上的优胜性。我们完整有大概在数据库上创建一其中间层用于字符的国际化处置,我就是这么做的。细心研讨一下JDBC操纵数据库呈现字符编码成绩的本源,很简单发明多半情形是ResultSet的几个String办法在作祟,因而我们就完整能够编写一个ResultSet两头层举行国际化处置,源码以下:
publicclassI18nResultSetimplementsResultSet{privateStringencoding;privateResultSetrs;publicI18nResultSet(ResultSetrs,Stringencoding)throwsjava.io.UnsupportedEncodingException{//反省该编码称号是不是被体系撑持。"".getBytes(encoding);this.rs=rs;this.encoding=encoding;}……//以下几个办法是举行String字符串的重编码.publicStringgetString(intindex)throwsSQLException{Stringdata=null;try{data=newString(rs.getBytes(index),encoding);}catch(java.io.UnsupportedEncodingExceptionuee){}}publicStringgetString(Stirngfield)throwsSQLException{Stringdata=null;try{data=newString(rs.getBytes(field),encoding);}catch(java.io.UnsupportedEncodingExceptionuee){}}publicvoidupdateString(intindex,Stringvalue)throwsSQLException{try{rs.updateBytes(index,value.getBytes(encoding));}catch(java.io.UnsupportedEncodingExceptionuee){}}publicvoidupdateString(Stringfield,Stringvalue)throwsSQLException{try{rs.updateBytes(field,value.getBytes(encoding));}catch(java.io.UnsupportedEncodingExceptionuee){}}……}
能够看出,一切的String操纵都利用特定编码的字节数组举行存取,如许经由过程界说encoding的值完成数据库存取数据编码的分歧性,且encoding完整能够经由过程在设置信息中静态界说。
同时,下面的程序又能够办理一些固有的字符串处置成绩,比方把持符如
导进到数据库中很有大概被剖析为
使其不克不及换行,经由过程字节数组操纵,就能够办理这个成绩。如许像文章固有格局就能够完全地保存上去而不必要举行分外转换操纵。
结论,经由过程多层处置机制利用两头层对数据库数据举行层层处置可以使处置环节之间构成松耦合干系,从而能够举行无效的把持。
上面给一个利用静态代办署理举行字符把持的代码(原创):
packagecom.yipsilon.crocodile.database;importjava.sql.ResultSet;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.io.UnsupportedEncodingException;/***作者yipsilon*如要转载,请关照作者*/publicclassI18nResultSetHandlerimplementsInvocationHandler{privateResultSetrs;privateStringencoding;publicI18nResultSetHandler(ResultSetrs,Stringencoding)throwsUnsupportedEncodingException{this.rs=rs;"".getBytes(encoding);this.encoding=encoding;}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{StringmethodName=method.getName();if(methodName.equals("getString")){Objectobj=args[0];if(objinstanceofInteger){returndecodeString(rs.getBytes(((Integer)obj).intValue()),encoding);}else{returndecodeString(rs.getBytes((String)obj),encoding);}}elseif(methodName.equals("updateString")){Objectobj=args[0];if(objinstanceofInteger){rs.updateBytes(((Integer)obj).intValue(),encodeString((String)args[1],encoding));}else{rs.updateBytes((String)obj,encodeString((String)args[1],encoding));}returnnull;}returnmethod.invoke(rs,args);}privateStringdecodeString(byte[]bytes,Stringenc){try{returnnewString(bytes,enc);}catch(UnsupportedEncodingExceptionuee){returnnewString(bytes);}}privatebyte[]encodeString(Stringstr,Stringenc){try{returnstr.getBytes(enc);}catch(UnsupportedEncodingExceptionuee){returnstr.getBytes();}}}
利用时挪用:
ResultSetrs=...;//原始的ResultSet了局集Stringencoding="GBK";//字符编码(ResultSet)Proxy.newProxyInstance(rs.getClass().getClassLoader(),rs.getClass().getInterfaces(),newI18nResultSetHandler(rs,encoding));
没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之! |
|