java 数据库基本操作 *|<~IQg
1、java数据库操作基本流程 \E<Qi3W>*
2、几个常用的重要技巧: i/H;4#Bz
可滚动、更新的记录集 H(P]Z~et
批量更新 Yf~Kzv1]*
事务处理 `]] <.>R
4Orq;8!BW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y:L[Iz95o
1、取得数据库连接 R=<::2_Y96
1)用DriverManager取数据库连接
s2wDJ|
例子 F:q8.^HTJ
String className,url,uid,pwd; DR:DXJc
className = "oracle.jdbc.driver.OracleDriver"; BRskxyL&,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;1{=t!z=
uid = "system"; UnP<`z#
pwd = "manager"; (GC5r#AnS
Class.forName(className); V$O 6m|q
Connection cn = DriverManager.getConnection(url,uid,pwd); UcOP 0_/
2)用jndi(java的命名和目录服务)方式 +,AzxP
_y
例子 8ih_S2Cd
String jndi = "jdbc/db"; D7JrGaF{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $u'"C|>8
DataSource ds = (DataSource) ctx.lookup(jndi); ) \T H'
Connection cn = ds.getConnection(); oz)4YBf
多用于jsp中 Z]oGE@!
n"
2、执行sql语句 a0gg<Ml
1)用Statement来执行sql语句 ;<B
String sql; s%`l>#H
Statement sm = cn.createStatement(); OKK Ko`RN
sm.executeQuery(sql); // 执行数据查询语句(select) sQkijo.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /4 OmnE;
2)用PreparedStatement来执行sql语句 "~._G5i.
String sql; {i?G:K
sql = "insert into user (id,name) values (?,?)"; wWfj#IB;R
PreparedStatement ps = cn.prepareStatement(sql); vmrs(k "d#
ps.setInt(1,xxx); ]1W xa?
ps.setString(2,xxx); c s*E9
... ~;H,cPvrEg
ResultSet rs = ps.executeQuery(); // 查询 CfP-oFHoQ
int c = ps.executeUpdate(); // 更新 3S]QIZ1
R=D}([pi
3、处理执行结果 $fT5Vc]B4
查询语句,返回记录集ResultSet AWx@Z7\z"g
更新语句,返回数字,表示该更新影响的记录数 qlYi:uygY
ResultSet的方法 {FKr^)g
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *fIn<Cc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6w;`A9G[YI
oe2*$\?.
4、释放连接 u_
l?d
cn.close(); &]RE 5!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *jWh4F,
+y8Y@e}>
可滚动、更新的记录集 G'#u!<(^h
1、创建可滚动、更新的Statement fRLA;1va
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4K~=l%l
该Statement取得的ResultSet就是可滚动的 R6oD
2、创建PreparedStatement时指定参数 ng9e)lU~*b
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); l&U$LN$*e
ResultSet.absolute(9000); 8b~
批量更新 SO(BkxV@
1、Statement yq[/9Pci A
Statement sm = cn.createStatement(); 9RHDkK{5
sm.addBatch(sql1); ^Cp2#d*
sm.addBatch(sql2); N\B&|;-V
... Xb>SA|6[|
sm.executeBatch() H1B%}G*Ir-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0E!-G= v
2、PreparedStatement `'<$N<!
PreparedStatement ps = cn.preparedStatement(sql); {}ADsh@7d'
{ WQ[nK5#
ps.setXXX(1,xxx); tzGQo5\
... `4'=&c9
ps.addBatch(); R2a99# J
} R@z`
ps.executeBatch(); 2p\xgAW?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 FGHCHSqLq
2&n6:"u|
事务的处理 !E?+1WDS0
1、关闭Connection的自动提交 E>tHKNyVTp
cn.setAutoCommit(false); 6',Hs
2、执行一系列sql语句 zQ{bMj<S
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Wq<oP
Statement sm ; FI[BZZW
sm = cn.createStatement(insert into user...); QY&c=bWAX"
sm.executeUpdate(); @W/k}<07
sm.close(); p|A ?F0
sm = cn.createStatement("insert into corp...); b3R(O|
sm.executeUpdate(); Kmaz"6A
sm.close(); l~o!(rpX
3、提交 [>54?4{|.
cn.commit(); @9_mk@
4、如果发生异常,那么回滚 {G x=QNd
cn.rollback();