java 数据库基本操作 :C>slxY
1、java数据库操作基本流程 * UBU?
2、几个常用的重要技巧: E3sl"d;~
可滚动、更新的记录集 X_O(j!h
批量更新 i>>_S&!9p
事务处理 A"i40 @+
XeJx/'9o{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #L[Atx
1、取得数据库连接 l.Qj?G
1)用DriverManager取数据库连接 yv]/A<gP+
例子 @
L?7`VoE
String className,url,uid,pwd; 7$}lkL
className = "oracle.jdbc.driver.OracleDriver"; EXoT$Wt{$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 53@*GXzE
uid = "system"; |*jnJWH4:
pwd = "manager"; MhWmY[
Class.forName(className); pz#oRuujY
Connection cn = DriverManager.getConnection(url,uid,pwd); x4R[Q&:M
2)用jndi(java的命名和目录服务)方式 '+5*ajP<
例子 0P&rTtU6
String jndi = "jdbc/db"; FdzsWm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ( *U Mpdj
DataSource ds = (DataSource) ctx.lookup(jndi); >t 3%-Kc
Connection cn = ds.getConnection(); K'Bq@6@C g
多用于jsp中 Wyw/imr
2、执行sql语句 rp+&ax}Wh
1)用Statement来执行sql语句 YN.rj-;^+
String sql; $5s?m\!jZz
Statement sm = cn.createStatement(); j[
kg9z
sm.executeQuery(sql); // 执行数据查询语句(select) GUJx?V/[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gW$X8ECX
2)用PreparedStatement来执行sql语句 tNG0ft%a
String sql; K;k&w; j
sql = "insert into user (id,name) values (?,?)"; QI.{M$,m~
PreparedStatement ps = cn.prepareStatement(sql); \l"1Io=
ps.setInt(1,xxx); e4j:IK>
ps.setString(2,xxx); 7GB>m}7
... d [6[3B
ResultSet rs = ps.executeQuery(); // 查询 w0q.cj@nd
int c = ps.executeUpdate(); // 更新 xOt%H\*k"
pmv;M`_|R
3、处理执行结果 iQ~;to;Y
查询语句,返回记录集ResultSet T:q!>"5
更新语句,返回数字,表示该更新影响的记录数 tF+m/}PM^
ResultSet的方法 294
0M4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B_aLqB]U
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dpx P
!Z3iu
4、释放连接 S bc
cn.close(); /YKg.DA|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q~MV0<{
x4r\cL1!
可滚动、更新的记录集 [>U'P1@ql
1、创建可滚动、更新的Statement j;WZ[g#t
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /2Y t\=S=
该Statement取得的ResultSet就是可滚动的 :&S6AP
2、创建PreparedStatement时指定参数 Cd?aC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >WVos 4
ResultSet.absolute(9000); 9o@5:.b<j
批量更新 /xUTm=w7u
1、Statement XJ^dX]4
Statement sm = cn.createStatement(); D
C{l.a.
sm.addBatch(sql1); ^7G@CBic"
sm.addBatch(sql2); f!|7j}3
... 8'
M43n
sm.executeBatch() ]DHB'NOh,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u!S ^lV@
2、PreparedStatement kc
Q~}uFB
PreparedStatement ps = cn.preparedStatement(sql);
|_xU{Pu
{ k?zw4S
ps.setXXX(1,xxx); Oe:+%p
... 3MPmLV#f
ps.addBatch(); 1MkQ$v7m
} wJ,l"bnq
ps.executeBatch(); Zi<Y?Vm/,O
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e*{'A
"j#;MOK
事务的处理 G~b/!clN
1、关闭Connection的自动提交 i|?EgGFG
cn.setAutoCommit(false); 4! ]28[2B6
2、执行一系列sql语句 ixm-wZI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }TI"j{(QJ
Statement sm ; 7:awUoV8f
sm = cn.createStatement(insert into user...); 2K[Y|.u8>q
sm.executeUpdate(); U$-Gc[=|
sm.close(); OHTJQ5%zL
sm = cn.createStatement("insert into corp...); &Azfpv
sm.executeUpdate(); + :4
F@R
sm.close(); U.g7' `Z<
3、提交 _Vul9=
cn.commit(); C^oj/}^
4、如果发生异常,那么回滚 MKMWHGN
cn.rollback();