java 数据库基本操作 Ta[}k/zW
1、java数据库操作基本流程 lMO0d_:b1
2、几个常用的重要技巧: U&eLj"XZ
可滚动、更新的记录集 OQsH,'
批量更新 /cjf 1Dc
事务处理 OIWo*
%
Aio0++r-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 be@MQ}6>
1、取得数据库连接 XnG!T$
1)用DriverManager取数据库连接 TM RXl.1
例子 _88~uYG
String className,url,uid,pwd; 7xd}J(l
className = "oracle.jdbc.driver.OracleDriver"; >3Y&jsh<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #e0+;kBh
uid = "system"; A P\E
pwd = "manager"; -FPl",f=r
Class.forName(className); 7vWB=r>5@
Connection cn = DriverManager.getConnection(url,uid,pwd); D6m>>&E['
2)用jndi(java的命名和目录服务)方式 {M$8V~8D
例子 AUq?<Vg\
String jndi = "jdbc/db"; :dj@i6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); l-npz)EM
DataSource ds = (DataSource) ctx.lookup(jndi); }$UFc1He\J
Connection cn = ds.getConnection(); qy]-YJZ
多用于jsp中 ]Lh\[@#1f
2、执行sql语句 k{#:O=
1)用Statement来执行sql语句
i}YnJ
String sql; 5u8Sxfm",
Statement sm = cn.createStatement(); z(=:J_N
sm.executeQuery(sql); // 执行数据查询语句(select) MWuVV=rd8a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $200?[
2)用PreparedStatement来执行sql语句 &V;a:
String sql; p[$I{F*a
sql = "insert into user (id,name) values (?,?)"; 7D^A:f
PreparedStatement ps = cn.prepareStatement(sql); *Zvw&y*
ps.setInt(1,xxx); x{- caOH
ps.setString(2,xxx); ppYz~ {"r
... ^Ve^}|qPc
ResultSet rs = ps.executeQuery(); // 查询 (o|E@d
int c = ps.executeUpdate(); // 更新 ibq@0CR
jL8zH
3、处理执行结果 ~,:f,FkSQ
查询语句,返回记录集ResultSet :)z_q!$j
更新语句,返回数字,表示该更新影响的记录数 ^/+sl-6/F
ResultSet的方法 3,[2-obmi
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `#]\Wnp~y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M Q6Y^,B
'tbb"MEi4
4、释放连接 (X9V-4
cn.close(); d.Z]R&X08
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =
` ^jz}
1gE`_%?K
可滚动、更新的记录集 D)_Ei'+*l
1、创建可滚动、更新的Statement *t_&im%E
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); y AWDk0bx
该Statement取得的ResultSet就是可滚动的 J-}NFWR;t
2、创建PreparedStatement时指定参数 =%3nKSg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); VPHCPGrk
ResultSet.absolute(9000); ]ok>PH]
批量更新 I ?>#neHc6
1、Statement ^Toi_
Statement sm = cn.createStatement(); (Y>MsqwWfC
sm.addBatch(sql1); =(ZGaZ}
sm.addBatch(sql2); @I&"P:E0F;
... kslN_\
sm.executeBatch() FMVmH!E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~laZ(Bma);
2、PreparedStatement {UcItLjY
PreparedStatement ps = cn.preparedStatement(sql); ng*%1;P
{ K288&D|1WU
ps.setXXX(1,xxx); |=LkV"_v
... %\l,X{X
ps.addBatch(); K +~v<F
} Db=gS=Qm
ps.executeBatch(); i.sq^]j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 W(aRO
X2cR+Ha0
事务的处理 R~~rqvLm
1、关闭Connection的自动提交
`xUPML-
cn.setAutoCommit(false); ^mi4q[PM
2、执行一系列sql语句 eEQ[^i
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [fp"MPP3
Statement sm ; Q$1K{14I
sm = cn.createStatement(insert into user...); D.(G 9H
sm.executeUpdate(); yUO|3ONT
sm.close(); 7g)3\C
sm = cn.createStatement("insert into corp...); u7?juI#Cl
sm.executeUpdate(); k`TJ<Dv;
sm.close(); 0>iFXw:fn
3、提交 ^d80\PXz
cn.commit(); 4MJzx9#
4、如果发生异常,那么回滚 ~7pjk
cn.rollback();