java 数据库基本操作 -02.n}u>
1、java数据库操作基本流程 z;Dc#SZnO(
2、几个常用的重要技巧: )q>q]eHz
可滚动、更新的记录集 .t$1B5
批量更新 "T' QbK0
事务处理 [ Ru( H
D[<~^R;*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ex4)R2c*
1、取得数据库连接 a5uBQ?
1)用DriverManager取数据库连接 ]w~ECP(ap
例子 c>L#(D\\
String className,url,uid,pwd; ^d!I{ y#
className = "oracle.jdbc.driver.OracleDriver"; #oxP,LR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; l#rr--];
uid = "system"; l'kVi
pwd = "manager"; ]s}9-!{O
Class.forName(className); K'S\$
Connection cn = DriverManager.getConnection(url,uid,pwd); r<EwtO+x
2)用jndi(java的命名和目录服务)方式 UiH5iZ<r;
例子 VVHL@
String jndi = "jdbc/db"; @~`:sa+H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0 1:(QJ
DataSource ds = (DataSource) ctx.lookup(jndi); <&iLMb:%
Connection cn = ds.getConnection(); )*Rr5l /l
多用于jsp中 ivJTE
2、执行sql语句 Ed>n/)Sm
1)用Statement来执行sql语句 |!uC [=
String sql; :\"g}AX
Statement sm = cn.createStatement(); 5 IFc"
sm.executeQuery(sql); // 执行数据查询语句(select) K<?[^\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $c7Utms
2)用PreparedStatement来执行sql语句 7x)32f"
String sql; X oh@ (%
sql = "insert into user (id,name) values (?,?)"; @+;
cFj
PreparedStatement ps = cn.prepareStatement(sql); w!
':Ws
ps.setInt(1,xxx); TZw['o
ps.setString(2,xxx); lCJ/@)
... A4f;ftB
ResultSet rs = ps.executeQuery(); // 查询 #s|,oIm
int c = ps.executeUpdate(); // 更新 lcuqzX{7
`k~w
14~w
3、处理执行结果 ?/^{sW'
|
查询语句,返回记录集ResultSet z i3gE$7
更新语句,返回数字,表示该更新影响的记录数 Jp +h''t
ResultSet的方法 Ql?>,FZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9 N9Q#o$!.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 F{F SmUxzK
JwcC9
O
4、释放连接 jP"yG#
cn.close(); 7WEoyd
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &ej|DM6
fP;2qho
可滚动、更新的记录集 ~uh,R-Q$
1、创建可滚动、更新的Statement (V#*}eGy
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #An_RU6h
该Statement取得的ResultSet就是可滚动的 wo_iCjmK
2、创建PreparedStatement时指定参数 L?r\J8Ch<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); p@%H.
5&&
ResultSet.absolute(9000); Y$nI9
批量更新 <M M(Z
1、Statement fx= %e
Statement sm = cn.createStatement(); VpWpC&
sm.addBatch(sql1); V; 1i/{
sm.addBatch(sql2);
4B'-tV
... iK9#{1BpML
sm.executeBatch() y+P$}Nru
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {#H'K*j{
2、PreparedStatement !l~3K(&4
PreparedStatement ps = cn.preparedStatement(sql); i2n66d
{ `bcCj~j
ps.setXXX(1,xxx); -|`E'b81
... f4&k48Ds
ps.addBatch(); },vVc/
} P*9L3R*=N
ps.executeBatch(); #4ii!ev
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F/0x`l
#5mnSky+s
事务的处理 A?Gk8
1、关闭Connection的自动提交 S")*~)N@
cn.setAutoCommit(false); YveNsn
2、执行一系列sql语句 'cvc\=p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |n\(I$
Statement sm ; psB9~EU&Q
sm = cn.createStatement(insert into user...); tk'3Q 1L
sm.executeUpdate(); G?v]|wdI
sm.close(); J_>nn
sm = cn.createStatement("insert into corp...); 5MS5 Q]/
sm.executeUpdate(); z|sR
`]K
sm.close(); Fn*)!,)
3、提交 ~:):.5o
cn.commit(); &-4SA j
4、如果发生异常,那么回滚 )*_n/^m
cn.rollback();