java 数据库基本操作 ~8pf.^,fi
1、java数据库操作基本流程 G:WMocyXI'
2、几个常用的重要技巧: 8ZG'?A+{
可滚动、更新的记录集 #4na>G|
批量更新 tsfOPth$*
事务处理 |,sUD/rt
J@Zm8r<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ).oqlA!
1、取得数据库连接
XN=<s;U
1)用DriverManager取数据库连接 d*A >P
例子 1uV_C[:
String className,url,uid,pwd; ,C&h~uRi#f
className = "oracle.jdbc.driver.OracleDriver"; Bf'jXM{-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }%k"qW<Y
uid = "system"; <u2*(BM4
pwd = "manager"; fy_'K}i3k
Class.forName(className); ]; ^OY\,
Connection cn = DriverManager.getConnection(url,uid,pwd); @z/]!n\~
2)用jndi(java的命名和目录服务)方式 i6`8yw
例子 \|62E):i1
String jndi = "jdbc/db"; 87<y_P@{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mnmwO(.
DataSource ds = (DataSource) ctx.lookup(jndi); 1v2wP2]|;
Connection cn = ds.getConnection(); sgX}`JH?z
多用于jsp中 <*(~x esPS
2、执行sql语句 p+8]H
%
1)用Statement来执行sql语句 8!UZ..
String sql; z%Z}vWn
Statement sm = cn.createStatement(); &g& &-=7)
sm.executeQuery(sql); // 执行数据查询语句(select) o=`9JKB~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (
?/0$DB
2)用PreparedStatement来执行sql语句 }(o/+H4
String sql; LG<lZ9+y
sql = "insert into user (id,name) values (?,?)"; 7abq3OK+`
PreparedStatement ps = cn.prepareStatement(sql); =r-Wy.a@
ps.setInt(1,xxx); 3gabk/
ps.setString(2,xxx); qsk71L
... er#we=h
ResultSet rs = ps.executeQuery(); // 查询 lZ)u4_
int c = ps.executeUpdate(); // 更新 Z,4=<;PF
EL}v>sC
3、处理执行结果 Tl%4L%
bE
查询语句,返回记录集ResultSet *|E@81s#
更新语句,返回数字,表示该更新影响的记录数 cF(9[8c{
ResultSet的方法 4tuEC-oh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false \~?s= LT
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~ml\|
FwW%@Y
4、释放连接 \pzvoj7{
cn.close(); %BG5[XQ7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xrX("ili
CIaabn
可滚动、更新的记录集 6wu/6DO
1、创建可滚动、更新的Statement GzB%vsv95
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "V^jAPDXb
该Statement取得的ResultSet就是可滚动的 ,o}[q92@w
2、创建PreparedStatement时指定参数 Y4714
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GUp51*#XR
ResultSet.absolute(9000); "mH^Owai
批量更新 ]cA~%$c89s
1、Statement wcL0#[)
Statement sm = cn.createStatement(); ~o2{Wn["
sm.addBatch(sql1); % qE#^ U
sm.addBatch(sql2); =0f8W=d:Vr
... {a_L
/"7
sm.executeBatch() ):|)/ZiC'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?Jr<gn^D
2、PreparedStatement /N^+a-.Qd
PreparedStatement ps = cn.preparedStatement(sql); u?J(l)gd
{ CD tYj
ps.setXXX(1,xxx); \) #3S $L~
... &qpA<F@7
ps.addBatch(); *
;M?R?+
} )xK!i.
ps.executeBatch(); [`b{eLCFX]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 VuBp$H(U
mPD'"
事务的处理 mY
AFruN
1、关闭Connection的自动提交 >L;O, {Px-
cn.setAutoCommit(false); l2v}PALs
2、执行一系列sql语句 K5ph x
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $I/p 6
Statement sm ; Y$Ke{6 4
sm = cn.createStatement(insert into user...); /vV 0$vg
sm.executeUpdate(); .Lp-'!i
sm.close(); 8)tyn'~i
sm = cn.createStatement("insert into corp...); .cabw+&7
sm.executeUpdate(); b;O+QRa
sm.close(); 8&;dR
3、提交 co@8w!W
cn.commit(); lz*2wGI9
4、如果发生异常,那么回滚 @t^2/H
?O
cn.rollback();