java 数据库基本操作 ,!t1( H
1、java数据库操作基本流程 IK5FSN]s/
2、几个常用的重要技巧: L,!?'.*/]
可滚动、更新的记录集 # m?GBr%k
批量更新 "6_#APoP
事务处理 @Tb
T
9|WBJ6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 E9pKR+P
1、取得数据库连接 O$u;]cg
1)用DriverManager取数据库连接 kRs[H xI3
例子 ~r;da 9
String className,url,uid,pwd; 5MV4N[;
className = "oracle.jdbc.driver.OracleDriver"; }MP2)6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~K% ]9
uid = "system"; $l-|abLELz
pwd = "manager"; {Uxah
Class.forName(className); !3U1HS-i62
Connection cn = DriverManager.getConnection(url,uid,pwd); 9XWF&6w6yf
2)用jndi(java的命名和目录服务)方式 h
Vz%{R"
例子 #<f}.P.Uc
String jndi = "jdbc/db"; `q* 0^}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7iu?Q
DataSource ds = (DataSource) ctx.lookup(jndi); W!q'wrIx(
Connection cn = ds.getConnection(); ;e;lPM{+
多用于jsp中 *-$u\?$
2、执行sql语句 hj64ES#x
1)用Statement来执行sql语句 u^a\02aV[
String sql; ya5a7
Statement sm = cn.createStatement(); ?GqFtNz
sm.executeQuery(sql); // 执行数据查询语句(select) uA=6 HpDB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oc'#sE
2)用PreparedStatement来执行sql语句 2+"=i/8
String sql; .O @bX)
sql = "insert into user (id,name) values (?,?)"; G}ElQD
PreparedStatement ps = cn.prepareStatement(sql); W=M&U
ps.setInt(1,xxx); ^(m`5]qr7J
ps.setString(2,xxx); L(TO5Y]
... :|`'\%zW-
ResultSet rs = ps.executeQuery(); // 查询 >C"cv^%c
int c = ps.executeUpdate(); // 更新 Pc{D,/EpR
.vNfbYH(
3、处理执行结果 ka{9{/dz3
查询语句,返回记录集ResultSet "L@qjSs8
更新语句,返回数字,表示该更新影响的记录数 !OWVOq8
ResultSet的方法 hKtOh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *E0+!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 D *W+0
dvxD{UH
4、释放连接 /-z_"G
cn.close(); +A8S 6bA[=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Le9r7O:
1~8F&
可滚动、更新的记录集 ]_I<-}?;
1、创建可滚动、更新的Statement _/ j44q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5Zs"CDU
该Statement取得的ResultSet就是可滚动的 8B;`9?CI
2、创建PreparedStatement时指定参数 \<|a>{`7]i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (ii 5p nq
ResultSet.absolute(9000); }#zE`IT
批量更新 q_HC68YF,
1、Statement ;hF >iw
Statement sm = cn.createStatement(); B)
&BqZ&
sm.addBatch(sql1); u~<>jAy
sm.addBatch(sql2); HP|,AmVLl
... =sRd5aMs
sm.executeBatch() I@cKiB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 E#Ynn6
2、PreparedStatement i_g="^
PreparedStatement ps = cn.preparedStatement(sql); S$W
*i@x?
{ RL~|Kr<7J
ps.setXXX(1,xxx); #W
1`vke3
... OH5
kT$
ps.addBatch();
j^KM
} As@~%0 S
ps.executeBatch(); ~B>I?j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %r6LU<;1@
F<BhN+U
事务的处理 %s$_KG !&
1、关闭Connection的自动提交 JeMhiY}
cn.setAutoCommit(false); ,iCd6M{
2、执行一系列sql语句 o"[P++qd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close L6BHh_*E
Statement sm ; Q !5Tw
sm = cn.createStatement(insert into user...); dDW],d}B;
sm.executeUpdate(); 7qon:]b4
sm.close(); U"-mLv"|
sm = cn.createStatement("insert into corp...);
&N0W!
sm.executeUpdate(); v3S{dX<
sm.close(); 25ul,t_Du
3、提交 s .^9;%@$J
cn.commit(); lO%Z4V_Mj
4、如果发生异常,那么回滚 Bp^>R`,
cn.rollback();