java 数据库基本操作 l<XYDb~op
1、java数据库操作基本流程 |dQz(z&6{5
2、几个常用的重要技巧: H?O5 "4a
可滚动、更新的记录集 6!>p<p"Ns
批量更新 Y_Fn)(
事务处理 6 eryf?
PwW$=M{\.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Xk.OyQ@
1、取得数据库连接 K ,NmDc^
1)用DriverManager取数据库连接 =s!0EwDH3
例子 Mv%Qze,\V^
String className,url,uid,pwd; zc8^#D2y&
className = "oracle.jdbc.driver.OracleDriver"; vYm-$KQ"o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9HO9>^
uid = "system"; {[#)Q.2
pwd = "manager"; F(n<:TvlK
Class.forName(className); ;U>nj],uv
Connection cn = DriverManager.getConnection(url,uid,pwd); v4hrS\M
2)用jndi(java的命名和目录服务)方式 b9rQQS
例子 &V1d"";SZ
String jndi = "jdbc/db"; vD@|]@gq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }xC2~
DataSource ds = (DataSource) ctx.lookup(jndi); Pw<' rN8''
Connection cn = ds.getConnection(); Uk] jy>7;!
多用于jsp中 V<#KFm$>C
2、执行sql语句 Hmr f\(x
1)用Statement来执行sql语句 t3<8n;'y:
String sql; 27N;>
Statement sm = cn.createStatement(); )qb'tZz/g_
sm.executeQuery(sql); // 执行数据查询语句(select) OW#0$%f
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gdeM,A|
2)用PreparedStatement来执行sql语句 D&F{0
String sql; N#Rb8&G)b
sql = "insert into user (id,name) values (?,?)"; EA(4xj&:U
PreparedStatement ps = cn.prepareStatement(sql); rl7up
ps.setInt(1,xxx); 7P2n{zd,
ps.setString(2,xxx); f$QkzWvr
... i[9yu-
ResultSet rs = ps.executeQuery(); // 查询 V K6D
int c = ps.executeUpdate(); // 更新 we[+6Z6J
D(ItNMcKu
3、处理执行结果 ]}lt^7\=
查询语句,返回记录集ResultSet Y >w7%N
更新语句,返回数字,表示该更新影响的记录数 dJ
I }uQ
ResultSet的方法 OY}FtGy
1、next(),将游标往后移动一行,如果成功返回true;否则返回false C0[U}Y/r2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 s1Acl\l-uF
Hh Q0>
4、释放连接 j~>{P=_}
cn.close();
^Zz^h@+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection l S,Jo/T@
2c]"*Pb
可滚动、更新的记录集 Ez~5ax7x
1、创建可滚动、更新的Statement "7y,d%H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *JDz0M4f
该Statement取得的ResultSet就是可滚动的 7qyPI
2、创建PreparedStatement时指定参数 z*h:Nt%.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2j8GJU/L
ResultSet.absolute(9000); iH4LZ
批量更新 iV/I909*''
1、Statement JD#q6&|
Statement sm = cn.createStatement(); JrOxnxd^
sm.addBatch(sql1); j yD3Sa3
sm.addBatch(sql2); R`@T<ob)
... l+@;f(8}
sm.executeBatch() iOg4(SPci
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]uox ^HC
2、PreparedStatement pZ'q_Oux
PreparedStatement ps = cn.preparedStatement(sql); \"(?k>]E
{ ,i6E L
ps.setXXX(1,xxx); pi"M*$
... AMjr[!44 @
ps.addBatch(); :W, S
} ,5v'hG
ps.executeBatch(); ,:PMS8pS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
j5/pVXO
x 4_MbUe
事务的处理 ^+D/59I
1、关闭Connection的自动提交 I`{*QU
cn.setAutoCommit(false); K bLSK
2、执行一系列sql语句 $h
pUI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %CHw+wT&
Statement sm ; Cd)g8<
sm = cn.createStatement(insert into user...); 73rme,
sm.executeUpdate(); r{v3XD/
sm.close(); Fge%6hu
sm = cn.createStatement("insert into corp...); 4&cQW)
sm.executeUpdate(); :rU.5(,
sm.close(); 3S3(Gl
3、提交 +"-l~`+<es
cn.commit(); u!|_bI3
4、如果发生异常,那么回滚 ,Suk_aX>
cn.rollback();