在用ORACLE数据库和JSP连接时要注意的一些问题精粹

来源:互联网 发布:usb监控软件 编辑:程序博客网 时间:2024/05/16 01:16
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>本人用ORACLE9i、oracle8、有很长的一段时间,我把用于JSP中需要注意的问题在这里写出来,仅供大家参考了。一、如何去处理Clob、BLOB的大类型CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据: getCharacterStream() 方法返回按unicode编码的输入流(java.io.Reader对象)getAsciiStream() 方法返回按ASCII编码的输入流(java.io.InputStream对象)所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法.现在举一个实际的例子,让我一步步学习如何使用CLOB.首先,创建一个含CLOB字段的表:create table test (id INTEGER, content clob);接下来, 我们通过JSP往这张表里插入一条记录,然后再获取显示它.插入操作: <% Connection con = DriverManager.getConnection(...); //该行从略 String content = request.getParameter("content"); //大文本数据 con.setAutoCommit(false); //* String sql = "insert into test values(1, empty_clob())"; Statement stmt = con.createStatement(); stmt.executeUpdate(sql); con.commit(); //* sql = "select content from test where id=1 for update"; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1); clob.putString(1, content); sql = "update test set content=? where id=" seq; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setClob(1, clob); pstmt.executeUpdate(); }%>以上需要注意的几点是:1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录.2) 通过select修改含lob类型的记录时一定要锁定该行(通过for update关键字实现),否则oracle会报错.3) 刚插入的记录就select for update, 会出现"违反读取顺序"错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了. 这就是上面那段代码里//*两行的作用.下面,我们将刚插入的记录从数据库中读取出来并显示之:<% String sql = "select content from test where doc_id=1"; ResultSet rs = stmt.executeQuery(sql); String content = ""; if (rs.next()) { oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("content"); if (clob != null){ Reader is = clob.getCharacterStream(); BufferedReader br = new BufferedReader(is); String s = br.readLine(); while (s != null) { content = s "
"; s = br.readLine(); } } out.println(content);%>二、编码问题因为JAVA的开发者是老外,所以他们对中文的支持并不是太好,这一点让不少的我们感到很是头痛,也就是我们通过说的汉字编码问题吧,关于一些汉字编码的规范我就不多说了,我主要是谈谈在和oracle数据库连接时的一些小问题,不过这些小问题很是让人头痛的。1、在插入到数据库中的中文问题要转换成编码2、从数据库中读到中文又要转换成编码让我们看一个编码的JAVA代码://ECov.javaimport java.io.UnsupportedEncodingException;public class ECov{public static String asc2gb(String asc){String ret;if(asc==null)return asc;try{ret=new String(asc.getBytes("ISO8859_1"),"GB2312");}catch(UnsupportedEncodingException e){ret=asc;}return ret;}public static String gb2asc(String gb){String ret;if(gb==null)return gb;try{ret=new String(gb.getBytes("GB2312"),"ISO8859_1");}catch(UnsupportedEncodingException e){ret=gb;}return ret;}public static int byte2int(byte b){return ((-1)>>>24)&b;}}其实这段代码的意思也就是把两种方法合而为一了。在进行数据库插入时要用ECov.gb2asc(arg),要在读时要用ECov.asc2gb(arg)。其中最关键的一点就是Oracle好像只认识ISO8859_1这种格式的编码吧(仅是我的想法)。三、一些小细节1、就是setAutoCommit(true or false),就是我们在sqlPlus中常用commit()的功能,如果是用true,就不要用commit(),否则还是用commit()方法的。2、对日期类型的处理,其实他并不是想象中setDate(),getDate()那么简单的,中间有很大的漏洞。大家自己多调试就会觉得有很多的乐趣的。3、在和数据库中最好是采用连接池技术,用标准的J2EE的环境,用简单的JNDI技术,是很好的一种方法的。-主页:http://www.fls-cts.com/kkjvk/
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 河清海晏的意思 海晏楼 海普瑞股票 海普瑞股吧 海普瑞药业 海普瑞股票吧 海普瑞老板 002399海普瑞 002399股票 002399股吧 海景酒店 海景公寓 海景别墅图 海景别墅多少钱 世纪海景别墅 洱海海景别墅 比华丽海景别墅 洱海海景房价钱 海景别墅模型 海景别墅效果图 海景别墅设计图 海景别墅设计图纸 海景房装修 中山海景房 马来西亚海景房 上海海景房 海景房价格 银滩海景房 一线海景房 海景房售楼处 海景房好卖吗 洱海海景房 哪里的海景房便宜 海景房怎么样 博鳌海景房 海景房投资 复式海景房 双廊海景房价格 便宜的海景房 双廊 海景房 便宜海景房