java 数据库基本操作 7>j~;p{
1、java数据库操作基本流程 CKK}Z;~:
2、几个常用的重要技巧: ]r|oNGD)G
可滚动、更新的记录集 ?hkOL$v<9}
批量更新 n8F5z|/
事务处理 @
G)yz!H
;H~<.QW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 NvJ5[W
1、取得数据库连接 1F`jptVQ\G
1)用DriverManager取数据库连接 Px=@Tw N,
例子 6^'BTd
String className,url,uid,pwd; -g2l-N{&
className = "oracle.jdbc.driver.OracleDriver"; \_8wU'7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; X@DW1<wEt
uid = "system"; 2,q*[Kh1
pwd = "manager"; 2NMs-Zs
Class.forName(className); %k1Pyv;]
Connection cn = DriverManager.getConnection(url,uid,pwd); u>"0>U
2)用jndi(java的命名和目录服务)方式 K$M+"#./
例子 mvZ#FF1,J
String jndi = "jdbc/db"; s b;q)Rh
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k[ro[E
DataSource ds = (DataSource) ctx.lookup(jndi); ,.W7Z~z
Connection cn = ds.getConnection(); .M^[/!
多用于jsp中 tWIJ,_8l
2、执行sql语句 yzhNl'Rz
1)用Statement来执行sql语句 =zyA~}M2
String sql; BtC*]WB"_'
Statement sm = cn.createStatement(); 'q)g,2B%
sm.executeQuery(sql); // 执行数据查询语句(select) G7nhUg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [ncK+rGAc
2)用PreparedStatement来执行sql语句 qy3@>
1G
String sql; rtj`FH??11
sql = "insert into user (id,name) values (?,?)"; \]u;NbC]
PreparedStatement ps = cn.prepareStatement(sql); (*9.GyK
ps.setInt(1,xxx); rR#Ditn^
ps.setString(2,xxx); U;MXiE3D
... ;[Mvk6^'R
ResultSet rs = ps.executeQuery(); // 查询 9KXL6#h
int c = ps.executeUpdate(); // 更新 :h{uZ,#Gi
z~ C8JY:
3、处理执行结果 VX$WL"A
查询语句,返回记录集ResultSet u##th8h4U
更新语句,返回数字,表示该更新影响的记录数 T^1
Z_|A
ResultSet的方法 8#7qHT;cx
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +
t5SrO!`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Tf86CH=)5
pZ.b
X
4、释放连接 CP~ZIIip"
cn.close(); x)~i`$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H3D<"4Q>
XnQR(r)pR2
可滚动、更新的记录集 Ku75YFO,5
1、创建可滚动、更新的Statement W#p7M[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -[=eVS.2%
该Statement取得的ResultSet就是可滚动的 CBEf;Ig
2、创建PreparedStatement时指定参数 pUXoSnIq:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \#_ymM0
ResultSet.absolute(9000); u
S1O-Q>
批量更新 }xk(aM_
1、Statement 3#>W\_FY*D
Statement sm = cn.createStatement(); oBkhb
sm.addBatch(sql1); sE pI)9
sm.addBatch(sql2); !ajBZ>Q
... `5IrV&a
sm.executeBatch() i41~-?Bc
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 OM*c7&
2、PreparedStatement 4 O!2nP
PreparedStatement ps = cn.preparedStatement(sql); Tnp
P '
{ G](4!G&
ps.setXXX(1,xxx); gc.Lh~
... #J"xByQKK
ps.addBatch(); c1yRy|
} I,{YxY[$7
ps.executeBatch(); SO$Af!S:bB
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !bE-&c
6Wu*zY_+
事务的处理 .:$(o&
1、关闭Connection的自动提交 8W\yM;'
cn.setAutoCommit(false); _}R[mr/
2、执行一系列sql语句 zt(lV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6:ettdj
Statement sm ; _=GjJ~2n
sm = cn.createStatement(insert into user...); $4nAb^/
sm.executeUpdate(); : {p'U2
sm.close();
d y HC8
sm = cn.createStatement("insert into corp...); "b} mVrFh
sm.executeUpdate(); 8s1nE_3
sm.close(); vYed_'_
3、提交 !D#"+&&G8
cn.commit(); hmu>s'
4、如果发生异常,那么回滚 Jka>Er
cn.rollback();