类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:










页面导航:
正文内容:resultsetmetadata rsmd = rs.getmetadata(); while ( rs.next() ){ map map = new hashmap(); //数据结果集从1开始 for ( int i = 1; i <= rsmd.getcolumncount(); i++ ){ map.put(rsmd.getcolumnname(i), cc.e2c(rs.getstring(i)==null ? "":rs.getstring(i))); } list.add(map); } /* * 对于为null的字段如何处理? * 如果表中有字段为null则会执行出错 * 1;数据库是否允许为空,不从数据库本身来限制而是从程序来保证 * 2;添加针对这种异常的特殊处理方法 * 在这里我利用简单的语句 ? : 来把null变成空白;在程序中有许多地方会出这样那样的问题 * 特别是null和空白导致的问题需要特别注意 */ }catch(sqlexception sqle){ // }finally{ try { if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (sqlexception sqle) { //上面一样的,用这个只是让他无论如何都要关闭连接,错误处理就算了:) } } return list; }
上面这个方法封装了数据库的select操作,它从连接池获取一个连接,编码之后,转存到map中,再返回一个map的list,最后把连接返回给连接池。实现字符编码的类: package cn.qhang.common;import java.io.unsupportedencodingexception;
/** * @author vulcan 用于字符编码转换,在数据库进或出之前 调用 todo 启航网站新系统 (c)2005 www.qhang.cn */ public class charconvertor { string c_encode = "gbk";
string e_encode = "iso-8859-1";
public string c2e(string str) { string str1 = null; try { str1 = new string(str.getbytes(c_encode), e_encode); } catch (unsupportedencodingexception e) { // todo 自动生成 catch 块 e.printstacktrace(); } return str1; }
public string e2c(string str) { string str1 = null; try { str1 = new string(str.getbytes(e_encode), c_encode); } catch (unsupportedencodingexception e) { // todo 自动生成 catch 块 e.printstacktrace(); } return str1; } //
}
注意到上面的字符编码类中有两个方法,分别实现了对数据的两个方向的编码;需要说明的是,如果是采用了struts框架,那么,实际上你只需要一个方向的编码即可,那就是最上面的程序中出现的,数据库读出的统一编码,而在struts的action中写入到数据库时,分两种情况: 1,你要插入数据库的来自于formbean的get方法,那么你不能先用cc.c2e进行编码,否则就会写入的是乱码:实例程序:下面的一个方法是项目中数据库写入一篇文章的实现: public int addarticle(articleform article){ string title = article.gettitle(); string categoryid = article.getcategoryid(); string addtime = article.getaddtime(); string content = article.getcontent(); string source = article.getsource();//文章来源,比如教务处阿 等等,字符编码装换 string picture = article.getpicture(); string adminid = article.getadminid();//只是管理员的id号,不用字符编码转换 string status = article.getstatus(); string sql = "insert into articles(title,categoryid,addtime,content,source,picture," +"adminid,status)values("+ title +"," + categoryid + "," + addtime + "," + content + "," + source + "," + picture + "," + adminid + "," + status + ")"; return (stmts.executeupdate(sql)); //当然成功了就会返回“1“,or not "0" /* * 晕阿~这种sql语句太难构建了吧,不过还好,写好了一劳永逸 :) */ }同样的原理,更新数据库的记录也一样。第二种情况:直接写入的,写入信息来自于程序中的字符串变量,那么在写入之前必须要进行编码转换:比如看下面的实例代码: string info1="中文数据信息"; string info = cc.c2e(info1); string sql="insert into form.clumn = " + info +""; //下面是执行的操作,省略了原因分析 在表单的输入内容被struts,actionservlet转储到关联的formbean时,采用的编码是java的默认编码,iso-8859-1,在以后的操作,一直在数据库插入之前都是8859_1,它对应于mysql的字符集,latin1.这一点在eclipse中设置断点,跟踪证明了。因此在struts项目中往数据库写入东西不能编码。下面总结一下这个方案:<!-- ============================== --> <!-- physical connection attributes --> <!-- ============================== -->
<!-- standard jdbc driver info -->
<dbname>qhang</dbname> <jndiname>jndi-qhang</jndiname> <driver>com.mysql.jdbc.driver</driver> <url>jdbc:mysql://localhost/qhang?useunicode=true&characterencoding=gbk</url>
<username>user</username> <password>password</password>
<minimumsize>0</minimumsize> <maximumsize>10</maximumsize> <connectiontimeout>600</connectiontimeout> <usertimeout>12</usertimeout> <shrinkby>10</shrinkby>
<logfile>d:/mysql/poolman.log</logfile> <debugging>true</debugging>
<!-- query cache attributes-->
<cacheenabled>false</cacheenabled> <cachesize>20</cachesize> <cacherefreshinterval>120</cacherefreshinterval>
</datasource> <datasource>
<!-- ============================== --> <!-- physical connection attributes --> <!-- ============================== -->
<!-- standard jdbc driver info -->
<dbname>qhangin</dbname> <jndiname>jndi-qhangin</jndiname> <driver>com.mysql.jdbc.driver</driver> <url>jdbc:mysql://localhost/qhang</url>
<username>user</username> <password>password</password>
<minimumsize>0</minimumsize> <maximumsize>10</maximumsize> <connectiontimeout>600</connectiontimeout> <usertimeout>12</usertimeout> <shrinkby>10</shrinkby>
<logfile>d:/mysql/poolman.log</logfile> <debugging>true</debugging>
<!-- query cache attributes-->
<cacheenabled>false</cacheenabled> <cachesize>20</cachesize> <cacherefreshinterval>120</cacherefreshinterval>
</datasource>
如果按照这样的方法,那么在我们应用程序的其他地方就不用考虑数据库的编码问题了,但是还是会有方案一中的表单提交返回时的乱码存在。特别说明:不要用mysql4.1.x版本,尽管mysql官方说可以,但是现在的jdbc-mysql连接器好像还不能设置字符编码。至少我多次试验证明了不起作用。