java 数据库基本操作 F5P{+z7
1、java数据库操作基本流程 P%HyIODS
2、几个常用的重要技巧: s,H(m8#>
可滚动、更新的记录集 ItE~MJ5p
批量更新 h##?~!xDmq
事务处理 ^!_7L4&y
':)j@O3-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 PJ:5Lb<
1、取得数据库连接 >Eg .c
1)用DriverManager取数据库连接 hpV
/F
例子 }A/&]1GWk
String className,url,uid,pwd; 6F/
OlK<
className = "oracle.jdbc.driver.OracleDriver"; jYID44$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; yc=#Jn?S
uid = "system"; q<[ke
pwd = "manager"; }IkEyJsk
Class.forName(className); h_GBx|c
Connection cn = DriverManager.getConnection(url,uid,pwd); W;]UP$5l
2)用jndi(java的命名和目录服务)方式 ./ y[<e
例子 ]V^.!=gh$
String jndi = "jdbc/db"; 6v O)s!b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6-14Htsk6
DataSource ds = (DataSource) ctx.lookup(jndi); 4Olv8nOe<
Connection cn = ds.getConnection(); (A fbS=[
多用于jsp中 L00;rTs>
2、执行sql语句 J*KBG2+13
1)用Statement来执行sql语句 Tc5OI' -V
String sql; 3l(;Pt-yI
Statement sm = cn.createStatement(); ,h.Jfo54,
sm.executeQuery(sql); // 执行数据查询语句(select) yi-"hT`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); A<X :K
nl
2)用PreparedStatement来执行sql语句 j{Jc6U
String sql; ZfCr"aL
sql = "insert into user (id,name) values (?,?)"; gdFoTcHgO|
PreparedStatement ps = cn.prepareStatement(sql); NG!cEo:2aa
ps.setInt(1,xxx); 3nC#$L-
ps.setString(2,xxx); #r^@*<{^
... pjs9b%.
ResultSet rs = ps.executeQuery(); // 查询 c0Ro3j\p
int c = ps.executeUpdate(); // 更新 G|oB'~{&
&\lS
3、处理执行结果 [piF MxZP
查询语句,返回记录集ResultSet hIo S#]
更新语句,返回数字,表示该更新影响的记录数 ^npS==Y]!.
ResultSet的方法 :F
w"u4WI
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7a]Zws
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V -4*nV
pMZf!&tM
4、释放连接 $F`<&o
cn.close(); )bXx9,VL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection akc"}+-oX
r,@X>_}
可滚动、更新的记录集 2G}7R5``9
1、创建可滚动、更新的Statement eTRx 6Fri(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <Bb<?7q$ld
该Statement取得的ResultSet就是可滚动的 fy=C!N&/
2、创建PreparedStatement时指定参数 p2c=;5|/Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $N+{r=
ResultSet.absolute(9000); hB$Y4~T%
批量更新 m/c&/6nk
1、Statement %OTA5
Statement sm = cn.createStatement(); 'Kzr-)JS
sm.addBatch(sql1); U[e8K
sm.addBatch(sql2);
1C,C)
... .6 ?>t!&W
sm.executeBatch() } .H Fm'p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &J/4J
2、PreparedStatement 3auJ^B}
PreparedStatement ps = cn.preparedStatement(sql); NuS|X
{ {}J@+Zsi
ps.setXXX(1,xxx); (06Vcqg
... ;ko[(eFN@
ps.addBatch(); MLD>"W
} "kBqY+:Cn
ps.executeBatch(); P2Qyz}!wo
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 r{B,uj"
0.BUfuuh
事务的处理 &kjwIg{
1、关闭Connection的自动提交 fzFvfMAU
cn.setAutoCommit(false); R4~zL!7;
2、执行一系列sql语句 Wt)SdF=U/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ZH$sMh<xg
Statement sm ; #C,f/PXfaB
sm = cn.createStatement(insert into user...); bu"68A;>
sm.executeUpdate(); ic0v*Y$
sm.close(); ,+f0cv4
sm = cn.createStatement("insert into corp...); m~j\?mb{+
sm.executeUpdate(); ~Riu*<
sm.close(); 01{r^ZT`RH
3、提交 ?y*+^E0
cn.commit(); 6`4W,
4、如果发生异常,那么回滚 Y zBA{FE
cn.rollback();