java 数据库基本操作 SUv'cld
1、java数据库操作基本流程 d!4TwpIgx
2、几个常用的重要技巧: (z8;J>7
可滚动、更新的记录集 R7K`9 c1f6
批量更新 I ~^Xw7
事务处理 !XM<`H/
!v(^wqna\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (
mn:!3H%
1、取得数据库连接 EeT69o
1)用DriverManager取数据库连接 gwdAf%|f
例子 KVh#"]<WV
String className,url,uid,pwd; {bR2S&=OmK
className = "oracle.jdbc.driver.OracleDriver"; %H;}+U]Z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8a&c=9
uid = "system"; |a
a\t
pwd = "manager"; Xs# _AX
Class.forName(className); JWYe~
Connection cn = DriverManager.getConnection(url,uid,pwd); J@"UFL'^
2)用jndi(java的命名和目录服务)方式 k5J18S
例子 dpK-
String jndi = "jdbc/db"; QnP?j&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); G+Bk!o
DataSource ds = (DataSource) ctx.lookup(jndi); znSlSQpTv
Connection cn = ds.getConnection(); 5gII|8>rQ
多用于jsp中 m Rm}7p
2、执行sql语句 Qc)i?Z'6
1)用Statement来执行sql语句 (wu ciKQ
String sql; p*)I QM<B
Statement sm = cn.createStatement(); V.*y_=i8t
sm.executeQuery(sql); // 执行数据查询语句(select) ^<;CIXo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); EpQy;#=;
2)用PreparedStatement来执行sql语句 j7QK8O$XL
String sql; 4/k`gT4
sql = "insert into user (id,name) values (?,?)"; &3;"$P
PreparedStatement ps = cn.prepareStatement(sql);
D~BL Txq
ps.setInt(1,xxx); YM6
J:89
ps.setString(2,xxx); 4c95G^dZ
... UCK;?]
ResultSet rs = ps.executeQuery(); // 查询 8|<</v8i
int c = ps.executeUpdate(); // 更新 =[&+R9s
M nZljB
3、处理执行结果 /H"fycZ
查询语句,返回记录集ResultSet )Tp"l"(G
更新语句,返回数字,表示该更新影响的记录数 09trFj$L
ResultSet的方法 @;$cX2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :CK`v6 Qs
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S89j:KRXH%
%p$XK(6
4、释放连接 vd(S&&]o1
cn.close(); *S"RU~1_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Jwfb%Xge~
%8h=_(X\7
可滚动、更新的记录集 M:/(~X{?
1、创建可滚动、更新的Statement /e[m;+9^&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CLk,]kA'r
该Statement取得的ResultSet就是可滚动的 $5.52
2、创建PreparedStatement时指定参数 E?czolNl
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <#4""FO*
ResultSet.absolute(9000); -CuuO=h
批量更新 |JF,n~n
1、Statement gzn:]Y^
Statement sm = cn.createStatement(); n|6G\99l+M
sm.addBatch(sql1); `2LmLFkb
sm.addBatch(sql2); A%?c1`ZxF
... 4w=v
/WDo
sm.executeBatch() r~YBj>}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }$ySZa9
2、PreparedStatement .r{t&HO;Y
PreparedStatement ps = cn.preparedStatement(sql); f<iK%
{ )[J!{$&y
ps.setXXX(1,xxx); ~tyqvHC
... 9#:fQ!3`
ps.addBatch(); c0o Z7)*}
} "igA^^?X1N
ps.executeBatch(); pe0ax-Zv
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \8!CKnfs
d'ZB{'[8p
事务的处理 /;d 5p
1、关闭Connection的自动提交 dO%f ;m>#
cn.setAutoCommit(false); R!QR@*N
2、执行一系列sql语句 XHj%U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M!5=3>Z
Statement sm ; X-fWdoN @-
sm = cn.createStatement(insert into user...); J$42*S Y
sm.executeUpdate(); f=}T^Z<
sm.close(); O/FI>RT\H
sm = cn.createStatement("insert into corp...); [j5+PV
sm.executeUpdate(); NK/y,f6
sm.close(); #::+# G
3、提交 6H:
fg
cn.commit(); ,b -
4、如果发生异常,那么回滚 >
^zNKgSQ
cn.rollback();