论坛积分策略 论坛VIP区开放申请 我爱电脑万人签名活动 原声大碟520欢迎你 广告位招租
发新话题
打印

[[ 其它 ]] Oracle数据库和JSP连接要注意的一些问题

Oracle数据库和JSP连接要注意的一些问题

用ORACLE9i、oracle8、有很长的一段时间,我把用于JSP中需要注意的问题在这里写出来,仅供大家参考了。 我爱电脑技术论坛, D0 c3 P; Z/ \* W+ V4 E; G
我爱电脑技术社区--打造最好的电脑技术自学交流平台/ j8 a1 h$ L7 R
打造最好的电脑自学交流论坛( C3 m& q. P' A; E7 ^2 F1 Q$ ~! b# x6 F
一、如何去处理Clob、BLOB的大类型
( T+ F; u& ]' F) l打造最好的电脑自学交流论坛www.520diannao.com) K) s. k/ E; y+ ?/ r: H
打造最好的电脑自学交流论坛* |* c; Q0 V6 C9 e5 [7 G" T  j2 p& P* `
CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据: 打造最好的电脑自学交流论坛. u0 i% [# g4 ^
我爱电脑技术社区--打造最好的电脑技术自学交流平台0 L  S2 G5 s5 I! v) A# y. g1 Q. O

* O, l$ e& D4 S7 n6 K' B* P我爱电脑技术论坛getCharacterStream() 方法返回按unicode编码的输入流(java.io.Reader对象) 1 K& W4 G% @- ^2 ]3 l8 o7 @0 Q
我爱电脑技术社区--打造最好的电脑技术自学交流平台. \9 S( [6 u5 g$ C7 Z5 l

- T9 a3 u1 {9 c' s% H我爱电脑技术论坛getAsciiStream() 方法返回按ASCII编码的输入流(java.io.InputStream对象) 我爱电脑技术社区--打造最好的电脑技术自学交流平台" I2 k9 I% W# Z; H

$ |& @! z( E, [  y# t0 J- z打造最好的电脑自学交流论坛
. b5 ~2 @% Q- [电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法.
! t  e' h- B. Awww.520diannao.com
; u4 c* `, ?5 c+ N: X, `5 Z# \打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 ^4 [, ?' g& S3 w  D
现在举一个实际的例子,让我一步步学习如何使用CLOB. 我爱电脑技术社区--打造最好的电脑技术自学交流平台6 Y4 F: z" \2 Q: S  _

; \2 b1 n% t% i8 O( W我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术社区--打造最好的电脑技术自学交流平台: i# h4 b' w$ E
首先,创建一个含CLOB字段的表:
5 d5 Z8 ], q, A我爱电脑技术社区--打造最好的电脑技术自学交流平台* P1 `+ Q8 J6 W  J0 z3 o% ~7 b4 ]

1 [8 H% I3 Z! s我爱电脑技术论坛create table test (id INTEGER, content clob);
! B2 X; [; g# }1 ^www.520diannao.com
9 W1 N1 B5 R# W* c' U5 K$ g我爱电脑技术论坛
: @0 A, ?$ L  g6 o接下来, 我们通过JSP往这张表里插入一条记录,然后再获取显示它.
. z1 K: s3 ~: ?7 t% }* [* L我爱电脑技术论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台' j+ @7 B+ R" }* C' P* f2 m0 c
& X2 h: @( v+ R/ e
插入操作:
9 @8 ~+ \0 a+ g/ e0 j我爱电脑技术论坛
2 K4 }3 l$ h1 F, s& hwww.520diannao.comwww.520diannao.com5 l" C8 a# d8 t2 z, z
以上需要注意的几点是:
' {9 w9 N8 \6 `4 o! q0 ]0 m7 X' I, G$ E$ ]0 l
我爱电脑技术社区--打造最好的电脑技术自学交流平台0 V! [0 o  w' f+ [3 S( {3 R0 M1 {+ t
1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录.
- P2 r7 V$ K5 X2 [# U. Q: e7 U打造最好的电脑自学交流论坛
7 E1 |6 o" M' v0 G: K/ [4 z我爱电脑技术社区--打造最好的电脑技术自学交流平台
5 {) V$ d  J, l' I5 d  Z打造最好的电脑自学交流论坛2) 通过select修改含lob类型的记录时一定要锁定该行(通过for update关键字实现),否则oracle会报错. 打造最好的电脑自学交流论坛- V9 u& k: |- @8 s
我爱电脑技术社区--打造最好的电脑技术自学交流平台. ]/ A+ g% z8 v% Z# }) W- A1 R
我爱电脑技术社区--打造最好的电脑技术自学交流平台$ \, @  b4 O5 W
3) 刚插入的记录就select for update, 会出现"违反读取顺序"错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了. 这就是上面那段代码里//*两行的作用.
0 f$ a8 x0 k' p% ^. G打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 s3 g3 D$ j8 [+ q

+ L) B$ U6 j3 ]; ]* Z+ ?/ ]7 J  H电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站下面,我们将刚插入的记录从数据库中读取出来并显示之: 我爱电脑技术社区--打造最好的电脑技术自学交流平台2 e% o: ^) v7 Q9 @1 H$ c
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站) _; S0 |' ^- X' I2 c' \* Q/ \
www.520diannao.com/ m& }1 Q- ~3 @) Y8 j! q% D
二、编码问题 www.520diannao.com5 G, B8 q4 e( g8 m# p

5 {8 J5 j2 C: I4 d) b我爱电脑技术社区--打造最好的电脑技术自学交流平台
# o& H  ?; s; s$ z4 |! {% dwww.520diannao.com因为JAVA的开发者是老外,所以他们对中文的支持并不是太好,这一点让不少的我们感到很是头痛,也就是我们通过说的汉字编码问题吧,关于一些汉字编码的规范我就不多说了,我主要是谈谈在和oracle数据库连接时的一些小问题,不过这些小问题很是让人头痛的。

TOP

1、在插入到数据库中的中文问题要转换成编码 . o; |, y  y: R% w2 o
我爱电脑技术论坛8 O& c* W' q- w3 I( i3 u& N: h

3 @# R" w9 b% w: p2、从数据库中读到中文又要转换成编码 打造最好的电脑自学交流论坛9 o4 n- H, }8 M  }. }6 _9 ]
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  C* Q+ t; t+ ]3 z' I0 J

9 O/ `8 w+ m  [8 z& h# _! d让我们看一个编码的JAVA代码:
0 f: D: d0 o, G' {www.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站5 W" ?9 }0 Q5 @/ P, e# v5 R$ F) N1 Y; N/ ^

1 m4 V. Z) J4 L+ z! Cwww.520diannao.com打造最好的电脑自学交流论坛+ `+ t. b5 [$ r
  //ECov.java 我爱电脑技术论坛; X- T& u: Q( w8 k

6 Q" O9 g# s( h7 `& R4 d: O' x% Kwww.520diannao.com  import java.io.UnsupportedEncodingException;
5 T, u4 d# U9 o( [
! X3 ?9 o$ U2 v+ C( x. Q1 Fwww.520diannao.com  public class ECov
& n' |, y& E8 `2 p, ]) ^+ F打造最好的电脑自学交流论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台- f# U9 f4 m6 C. E8 _/ ]
  { 打造最好的电脑自学交流论坛; h& R% F1 D  ?+ t
5 V; d, r7 L# ]% h- T
  public static String asc2gb(String asc){ 我爱电脑技术社区--打造最好的电脑技术自学交流平台" Y2 d% n9 Q) J, Q5 p( X# g- `
2 @8 y: t1 F2 R4 U  M
  String ret;
* u" [. z7 A' L  X4 i, awww.520diannao.com
& D" x8 X4 `4 ]- O) P1 J8 G  if(asc==null)return asc; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站3 C; U  K; p9 v$ S0 r- m; G
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站$ e) m4 `5 m* ^* C
  try{
: r' P, [5 _3 `  `3 K$ n
9 E. }2 E7 W2 W. |) D, U" Q3 Y. G电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  ret=new String(asc.getBytes("ISO8859_1"),"GB2312");
' w( p9 z( p  Z1 C电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站& _$ J# W6 c) r- P, o! D6 E# @
  } 8 u8 i9 X- l: f, N

1 H1 ^/ d/ ~# \4 X! G3 q' r电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  catch(UnsupportedEncodingException e){
& G" X$ S+ m/ l$ @, Z
) C- z6 c' k) V. n( y$ M4 g6 x& _电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  ret=asc; 打造最好的电脑自学交流论坛; j. z* ]" {. u8 Y  \& r; J

6 ]9 O2 r% I9 X) z- K% l我爱电脑技术社区--打造最好的电脑技术自学交流平台  }
% {! j: K# Q; U. H4 n$ {www.520diannao.com
; ~' b$ [  S0 m  f我爱电脑技术论坛  return ret;
1 {: D  e# a# R& h$ iwww.520diannao.com
. u" L, w. l, }! p, C# ywww.520diannao.com  } ) Z; b5 }2 z% X4 i

$ d- p: ]% }- W7 \3 S1 y# v  public static String gb2asc(String gb){
0 ~4 U7 K5 _+ x5 j+ N; ~" }( h. c打造最好的电脑自学交流论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台; y1 v9 I) P8 {" P  w+ {% w# P, h
  String ret; www.520diannao.com* Z7 z; w1 z8 m: Q3 j) [

: G% x4 _3 C& c+ U; e( K0 [; t0 A我爱电脑技术论坛  if(gb==null)return gb; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  M( w: B/ {3 A" |# h
1 U" M  W, R" `. y( }( q4 q5 y- u
  try{ 我爱电脑技术社区--打造最好的电脑技术自学交流平台$ H0 n2 ?& l3 c
7 v$ [: T3 Q0 \& g) d
  ret=new String(gb.getBytes("GB2312"),"ISO8859_1");
6 Y$ l  e  R0 e1 E) S打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛$ M+ Q+ W4 X, W. O. E
  }
2 Q* D  L  [& S; k: ?打造最好的电脑自学交流论坛www.520diannao.com- g$ Z3 h- ?! h
  catch(UnsupportedEncodingException e){
2 _1 f. @  W- d电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
; f* A- f6 t' j4 j5 o我爱电脑技术论坛  ret=gb;
! q8 o5 C( ^. v" N% y- owww.520diannao.com我爱电脑技术论坛1 a* {3 W# g; r9 q  O6 q
  }
2 @. N2 u* e6 ^, J& m. a1 T% C; T: u打造最好的电脑自学交流论坛
+ g4 s$ h5 D/ W我爱电脑技术论坛  return ret;
6 s) l5 ~" M" }4 C( p) Mwww.520diannao.comwww.520diannao.com: _$ i" o4 E, Y' A: u* D
  } & A8 k  S# [3 R
2 n. a; \7 M/ m
  public static int byte2int(byte b){ www.520diannao.com. W+ x! A1 U" a7 ~9 P  J- L/ e
我爱电脑技术论坛9 x/ u2 J  {* T, A+ k2 `/ ]% O7 M
  return ((-1)>>>24)&b;
7 u3 C% s3 F0 z" L/ V0 U
: b# U1 a; W+ C) y9 }4 k- D9 @我爱电脑技术论坛  } 我爱电脑技术论坛( a# B8 D) [  f0 `; |' J

/ F7 ]1 w9 _" I9 Q: n$ ~7 i我爱电脑技术论坛  }www.520diannao.com1 [8 j3 R0 V7 y% o9 Y% n

* @: ^. W: S1 j/ V' F5 p我爱电脑技术社区--打造最好的电脑技术自学交流平台  w& v# F& v' O2 n
我爱电脑技术社区--打造最好的电脑技术自学交流平台- m6 Y- X7 Q) A7 J& D4 s
其实这段代码的意思也就是把两种方法合而为一了。
; k- z' S- e8 O电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
9 p! K* v  ]7 @9 h, X我爱电脑技术论坛我爱电脑技术论坛4 Q  [. r9 ~0 T) s; C
在进行数据库插入时要用ECov.gb2asc(arg),要在读时要用ECov.asc2gb(arg)。其中最关键的一点就是Oracle好像只认识ISO8859_1这种格式的编码吧(仅是我的想法)。
: @! K1 d$ ~! H# H5 L$ ]; N& M! N我爱电脑技术论坛打造最好的电脑自学交流论坛3 n( {) j! G* ]+ g
我爱电脑技术论坛' D! t9 I1 S9 @* i& |
三、一些小细节
' ?' s3 j0 f4 S( t我爱电脑技术论坛
7 Q7 c2 B% E, q( H5 z# U' S+ H! Nwww.520diannao.com我爱电脑技术社区--打造最好的电脑技术自学交流平台/ R- x, t9 h7 D4 D5 ^
1、就是setAutoCommit(true or false),就是我们在sqlPlus中常用commit()的功能,如果是用true,就不要用commit(),否则还是用commit()方法的。 我爱电脑技术社区--打造最好的电脑技术自学交流平台% V1 j/ S; t1 Q2 Q- `

  N, j7 ]& U, {% }5 u2 t打造最好的电脑自学交流论坛
; |3 \' h* {* r4 P+ P) Y打造最好的电脑自学交流论坛2、对日期类型的处理,其实他并不是想象中setDate(),getDate()那么简单的,中间有很大的漏洞。大家自己多调试就会觉得有很多的乐趣的。 # O: j+ p& W( j9 H& H5 k2 S' w
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站; G7 _, D7 B, W/ y, R& q( \# ?
打造最好的电脑自学交流论坛- `5 l6 E8 x% X( a- i; e; j* q; s
3、在和数据库中最好是采用连接池技术,用标准的J2EE的环境,用简单的JNDI技术,是很好的一种方法的。

TOP

发新话题