java 数据库基本操作 5eTA]
1、java数据库操作基本流程 Ub3$ `
2、几个常用的重要技巧: QEJu.o
可滚动、更新的记录集 oZ%uq78#[%
批量更新 &hWELZe0vv
事务处理 b-&rMML
iE'_x$i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I*-\u
1、取得数据库连接 8&@=Anc&q
1)用DriverManager取数据库连接 m^ xTV-#l@
例子 e)e(f"t6Q
String className,url,uid,pwd; wC{sP"D
className = "oracle.jdbc.driver.OracleDriver"; TZgtu+&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M1Q&)am
uid = "system"; |P5dv>tb
F
pwd = "manager"; 45JL{YRN
Class.forName(className); *Dg@fxCQ
Connection cn = DriverManager.getConnection(url,uid,pwd); +
f6LG 0q
2)用jndi(java的命名和目录服务)方式 s-CAo~,
例子 0C<\m\|~k
String jndi = "jdbc/db"; 85E$m'0O
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6(E4l5%
DataSource ds = (DataSource) ctx.lookup(jndi); Z 8w\[AF{$
Connection cn = ds.getConnection(); KGgtEh|
多用于jsp中 n5QO'Jr%[
2、执行sql语句 Z|qI[ui O
1)用Statement来执行sql语句 Vl^x_gs#_]
String sql; &;$uU
Statement sm = cn.createStatement(); BwHJr(n
sm.executeQuery(sql); // 执行数据查询语句(select) .B`$hxl*0c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); S|=)^$:
2)用PreparedStatement来执行sql语句 ]xvA2!)Q
String sql; I$"Z\c8;
sql = "insert into user (id,name) values (?,?)"; .F ?ww}2p]
PreparedStatement ps = cn.prepareStatement(sql); #eJfwc1JY
ps.setInt(1,xxx); ?xaUWD
ps.setString(2,xxx); ;2kQ)Bq"
... kQ=bd{a6
ResultSet rs = ps.executeQuery(); // 查询 6/;YS[jX
int c = ps.executeUpdate(); // 更新 +C`!4v\n
oywPPVxj
3、处理执行结果 v/ry" W
查询语句,返回记录集ResultSet ranem0KQ)]
更新语句,返回数字,表示该更新影响的记录数 phDIUhL$z
ResultSet的方法 1sXCu|\q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "==c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "W5MZ
|)7K(R)(=
4、释放连接 `he# !"
cn.close(); j}Tv/O,f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @*hv|zjs
XGZZKvp
可滚动、更新的记录集 Ny"9!3V
1、创建可滚动、更新的Statement l4RqQ+[KA;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~?NCmU=3
该Statement取得的ResultSet就是可滚动的 8ve-g\C8 H
2、创建PreparedStatement时指定参数 j"jssbu}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0Px Hf*
ResultSet.absolute(9000); JlSqTfA
批量更新 yD<#Q\,
1、Statement t3$ cX_
Statement sm = cn.createStatement(); >.SO2w
sm.addBatch(sql1); T]0K4dp+
sm.addBatch(sql2); /[6wm1?!
... M.H!dZ
sm.executeBatch() S:!5|o|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u/W{JPlL
2、PreparedStatement R V#w0 r
PreparedStatement ps = cn.preparedStatement(sql); Z*Ffdh>*:&
{ :+YHj)mN
ps.setXXX(1,xxx); yl>^QMmo
... -,
+o*BP
ps.addBatch(); ;*5z&1O
} Dml?.-Uv<
ps.executeBatch(); "pt[Nm76)8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 pRfKlTU\
1<9d[N*
事务的处理 -F`gRAr-
1、关闭Connection的自动提交 @IL@|Srs8
cn.setAutoCommit(false); ,8*A#cT
B
2、执行一系列sql语句 _U*R_2aV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close QY+{ OCB
Statement sm ; N_D=j6B
sm = cn.createStatement(insert into user...); 23LG)or.JC
sm.executeUpdate(); C=c&.-Nb9
sm.close(); WA}'[h
sm = cn.createStatement("insert into corp...); a3A-N] ;f
sm.executeUpdate(); em'3 8L|(
sm.close(); fe4/[S{a
3、提交 Il/`#b@h
cn.commit(); !o'a]8
4、如果发生异常,那么回滚 '1!%yKc0
cn.rollback();