java 数据库基本操作 j}8IT
1、java数据库操作基本流程 gUDd2T#
2、几个常用的重要技巧: 0O4'Ts ?
可滚动、更新的记录集 9m56oT'U{
批量更新 "hz(A.THi
事务处理 s<0yQ-=.?N
Vja' :i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 FVLXq0<Cj
1、取得数据库连接 L]0+u\(
1)用DriverManager取数据库连接 IDBhhv3ak
例子 jM
J[6qj
String className,url,uid,pwd; M0o=bYI
className = "oracle.jdbc.driver.OracleDriver"; Y%qhgzz?/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZTd_EY0 q
uid = "system"; pfg"6P
pwd = "manager"; en7i})v\".
Class.forName(className); H^"BK-`hs
Connection cn = DriverManager.getConnection(url,uid,pwd); D+rDgrv
2)用jndi(java的命名和目录服务)方式 ~bT0gIc
例子 hXS'*vO"
String jndi = "jdbc/db"; bf3LNV|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q3%a=ba)h
DataSource ds = (DataSource) ctx.lookup(jndi); 9<<$uf.B
Connection cn = ds.getConnection(); 0<{/T*AU:
多用于jsp中 mquna"}N
2、执行sql语句 !_<. 6ja
1)用Statement来执行sql语句 `{I,!to
String sql;
3@$h/xMJ
Statement sm = cn.createStatement(); l>"gO9j
sm.executeQuery(sql); // 执行数据查询语句(select) mL+}Ka
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ndi'b_Sh\
2)用PreparedStatement来执行sql语句 KtY~Y
String sql; =B1t?("
sql = "insert into user (id,name) values (?,?)"; h0n0Dc{4
PreparedStatement ps = cn.prepareStatement(sql); b7v] g]*
ps.setInt(1,xxx); wd*T"V3
ps.setString(2,xxx); F-k1yZ?^
... MS^,h>KI
ResultSet rs = ps.executeQuery(); // 查询 u!g=>zEu
int c = ps.executeUpdate(); // 更新 /(n)I
UE7P =B
3、处理执行结果 D]y6*Ha
查询语句,返回记录集ResultSet }3:TPW5S
更新语句,返回数字,表示该更新影响的记录数 psRm*,*O
ResultSet的方法 y5a^xRDw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false A#1aO
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f]T1:N*t
g/+M&k$
4、释放连接 $$ _ uQf
cn.close(); hl}#bZ8]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection KtEMH
)2YU|
可滚动、更新的记录集 \Qk:\aLR
1、创建可滚动、更新的Statement y(.WK8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); B>X+eK
该Statement取得的ResultSet就是可滚动的 1sc #!^Oo
2、创建PreparedStatement时指定参数 mm#U a/~1u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &%u,b~cL?
ResultSet.absolute(9000); g/z9bOgIX
批量更新 8f^URN<x
1、Statement C==tJog[
Statement sm = cn.createStatement(); yF0,}
sm.addBatch(sql1); Z+t?ah00
sm.addBatch(sql2); m)_1->K
... /UyW&]nK
sm.executeBatch() w0/W=!_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 58e{WC
2、PreparedStatement Zy*}C,Z
PreparedStatement ps = cn.preparedStatement(sql); f+xGf6V
{ e@]cI/j
ps.setXXX(1,xxx); oE)c8rE
... ~ezCE4^&
ps.addBatch(); -<z'f){gb
} fbuop&FN+q
ps.executeBatch(); r@%32h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :Yz.Bfli
NBMY1Xgj
事务的处理 p6=#LwL'
1、关闭Connection的自动提交 4vqu(w8
L
cn.setAutoCommit(false); R<UjhCvx.
2、执行一系列sql语句 aE{b65'Dt
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "6KOql3
Statement sm ; W]Ph:O^5c
sm = cn.createStatement(insert into user...); PYz| d
sm.executeUpdate(); $Uewv
+
sm.close(); HwST^\Ao
sm = cn.createStatement("insert into corp...); ;;nmF#
sm.executeUpdate(); D@
=.4z
sm.close(); vMRKs#&8
3、提交 bMSF-lQ
cn.commit(); ui 2RTAb
4、如果发生异常,那么回滚 GMNf#;x
cn.rollback();