java 数据库基本操作
Fbo"Csn_
1、java数据库操作基本流程 .OJGo<#$f
2、几个常用的重要技巧: ,t 2CQ
可滚动、更新的记录集 P"NI> HM
批量更新 ~k34#j:J65
事务处理 Vs5 &X+k
E6GubU
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^X&`YXjuN
1、取得数据库连接 6Y2,fW8i,
1)用DriverManager取数据库连接 jN+`V)p
例子 8
o}5QOW
String className,url,uid,pwd; "22./vWV|i
className = "oracle.jdbc.driver.OracleDriver"; vGyQ306
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Q%O9DCi
uid = "system"; Hs)]
pwd = "manager"; p>)1Z<D"a
Class.forName(className); S+06pj4Ie
Connection cn = DriverManager.getConnection(url,uid,pwd); q-t%spkl
2)用jndi(java的命名和目录服务)方式 6teu_FS
例子 b#I,Z+0ry
String jndi = "jdbc/db"; :fmV||Q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <uIPv
Zsx
DataSource ds = (DataSource) ctx.lookup(jndi); VQ!4(
<XD
Connection cn = ds.getConnection(); ^:?z7m
多用于jsp中 |6NvByc,
2、执行sql语句 5V<6_o
1)用Statement来执行sql语句 L^e*_q2d:>
String sql; _LF'0s*
Statement sm = cn.createStatement(); .:H'9QJg
sm.executeQuery(sql); // 执行数据查询语句(select) ybJa:
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~6#mVP5sU)
2)用PreparedStatement来执行sql语句 @dQr^'h
String sql; =3,<(F5Y[
sql = "insert into user (id,name) values (?,?)"; TJP;!uX
PreparedStatement ps = cn.prepareStatement(sql); 5 n 4/}s
ps.setInt(1,xxx); ?Ho$fGz
ps.setString(2,xxx); 4`~OxL
... 36'J9h\
ResultSet rs = ps.executeQuery(); // 查询 ruqE]Hx9(
int c = ps.executeUpdate(); // 更新 ]Q^8
9?
'NWvQR<X
3、处理执行结果 z*nztvY@e
查询语句,返回记录集ResultSet &/EZn xl
更新语句,返回数字,表示该更新影响的记录数 Rt%Dps%
ResultSet的方法 R(Vd[EGY
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Q3lVx5G>4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 /_fZ2$/
jM*wm~4>@
4、释放连接 5YZ\@<|rH
cn.close(); 'PMzm/;8st
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <\:*cET3
"~C\Z} ;
可滚动、更新的记录集 O'SxTwO
1、创建可滚动、更新的Statement Zo-Au
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R U[
该Statement取得的ResultSet就是可滚动的 9LQy0Gx
2、创建PreparedStatement时指定参数 "6$+B/5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5}NO~Xd<
ResultSet.absolute(9000); XSZjuQ<[3
批量更新 ^1}ffE(3>
1、Statement *|+ ~V/#
Statement sm = cn.createStatement(); bVRxGn @l
sm.addBatch(sql1); _}Gs9sHr0K
sm.addBatch(sql2); QqY42hR
... n O}x,sG2'
sm.executeBatch() 9DXu*}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;c~DBJg'|
2、PreparedStatement BcGQpv&x
PreparedStatement ps = cn.preparedStatement(sql); Us9$,(3
{ -JF|770i
ps.setXXX(1,xxx); 4ri)%dl1
... K3UG6S\B
ps.addBatch(); yC=vTzzp
} $PbN=@
ps.executeBatch(); `|JQ)!Agx
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8<^6<c
CtDS lJ
事务的处理 .uagD[${
1、关闭Connection的自动提交 &4MVk3SLx#
cn.setAutoCommit(false); H+2J.&Ch
2、执行一系列sql语句
K[TMTn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 'E8dkVlI
Statement sm ; 7e#|=e
*I!
sm = cn.createStatement(insert into user...); ?t.?f`(|
sm.executeUpdate(); J>Rt2K
sm.close(); l 0b=;^6
sm = cn.createStatement("insert into corp...); 0\}j[-`pF
sm.executeUpdate(); 4_I,wG@
sm.close(); -+I! (?
3、提交 XWy
iS\
cn.commit(); Sdt2D
4、如果发生异常,那么回滚 ;1OTK6
cn.rollback();