java 数据库基本操作 &{uj3s&C
1、java数据库操作基本流程 _* m<Z;Et
2、几个常用的重要技巧: ,ut-Di=6
可滚动、更新的记录集 ^tTASK
批量更新 +>}LT_
事务处理 rn9n _)
w5+H9R6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :2zga=)g
1、取得数据库连接 p.^qB]%
1)用DriverManager取数据库连接 sW^e D;
例子 tSVWO]<
String className,url,uid,pwd; JJZu%9~[
className = "oracle.jdbc.driver.OracleDriver"; 8= kwc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !*eDT4a
uid = "system"; L}a-c(G+8
pwd = "manager";
-k8<LR3
Class.forName(className); mfqnRPZ
Connection cn = DriverManager.getConnection(url,uid,pwd); 5(=5GkE)>
2)用jndi(java的命名和目录服务)方式 v6M4KC2?
例子 qipV'T,S
String jndi = "jdbc/db"; ('k9X cTPP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Fd86P.Df
DataSource ds = (DataSource) ctx.lookup(jndi); dM=45$\q
Connection cn = ds.getConnection(); mPL0s
多用于jsp中 F1)5"7f
2、执行sql语句 y '[VZ$^i
1)用Statement来执行sql语句 7 'q *(v
String sql; 2O
2HmL
Statement sm = cn.createStatement(); Uc;~q-??#
sm.executeQuery(sql); // 执行数据查询语句(select) sg8[TFX@Z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); vc0LV'lmg
2)用PreparedStatement来执行sql语句 -|GKtZ]}
String sql; L</k+a?H!
sql = "insert into user (id,name) values (?,?)"; X- ZZLl#
PreparedStatement ps = cn.prepareStatement(sql); QR2S67-
ps.setInt(1,xxx); O
joa3
ps.setString(2,xxx); R4y]<8}
... "ze-Mb
ResultSet rs = ps.executeQuery(); // 查询 kV+%(Gl8
int c = ps.executeUpdate(); // 更新 KdBpfPny@
6CCm1F{`
3、处理执行结果 ]h?q1
查询语句,返回记录集ResultSet hUC157
更新语句,返回数字,表示该更新影响的记录数 g<N;31:c\
ResultSet的方法 p|C[T]J\@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H$+@O-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ", p5}}/
P)l_ :;&
4、释放连接 I>GBnx
L
cn.close(); _%[po%]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g#MLA5%=u
)q66^%;S
可滚动、更新的记录集 57~y 7/ 0
1、创建可滚动、更新的Statement _u+ 7>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UE{$hLI?g
该Statement取得的ResultSet就是可滚动的 }T0O~c{$i
2、创建PreparedStatement时指定参数 ZfH+Iqd
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !
,bQ;p3g|
ResultSet.absolute(9000); sH.=Faos
批量更新 ?ac4GA(
1、Statement vK%*5
Statement sm = cn.createStatement(); o@BV&|
sm.addBatch(sql1); ~nTj't2R
sm.addBatch(sql2); f4
qVUU
... J#48c'
sm.executeBatch() lxm/*^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1~'jC8&J
2、PreparedStatement mU]VFPr5
PreparedStatement ps = cn.preparedStatement(sql); qiB~
{ n>?D-)g
ps.setXXX(1,xxx); FpiTQC7d
... x9,jXd
ps.addBatch(); 5Yhcnwdm!
} P`ou:M{8
ps.executeBatch(); <^\rv42'(2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (c>g7d<>n
L;*
s-j6y
事务的处理 qXg&E}]:=
1、关闭Connection的自动提交 puJB&u"4L
cn.setAutoCommit(false); 'Y /0:)
2、执行一系列sql语句 X%+lgm+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ujRXAN@mC
Statement sm ; dYwkP^KB
sm = cn.createStatement(insert into user...); 58Ce>*~
sm.executeUpdate(); `Bw]PO
sm.close(); 1vxRhS&FY
sm = cn.createStatement("insert into corp...); Y@`uBB[
sm.executeUpdate(); rNR7}o~ qo
sm.close(); N^dQX,j
3、提交 {YgU23;q
cn.commit(); \c
-m\|
4、如果发生异常,那么回滚 ts!tv6@
cn.rollback();