java 数据库基本操作 i=oTg
1、java数据库操作基本流程 !*&4< _
2、几个常用的重要技巧: w6vLNX
可滚动、更新的记录集 fO K|:
批量更新 A -Mj|V
事务处理 HHz;0V4w?
r"R(}`<,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (tepmcf
1、取得数据库连接 s(t eQ\
1)用DriverManager取数据库连接 d9O:,DKf
例子 cZqfz
String className,url,uid,pwd; *kP;{Cb`
className = "oracle.jdbc.driver.OracleDriver"; 8tU>DJ}0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; mge#YV::
uid = "system"; n_v02vFAHT
pwd = "manager"; C(G(^_6
Class.forName(className); 6N"m?g*Z
d
Connection cn = DriverManager.getConnection(url,uid,pwd); rwy+~
2)用jndi(java的命名和目录服务)方式 H4t)+(:D'
例子 Zr=ib
String jndi = "jdbc/db"; 7 0_}S*T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y?<)Dg.[
DataSource ds = (DataSource) ctx.lookup(jndi); Gb;99mE
Connection cn = ds.getConnection(); z&O#v9.NE|
多用于jsp中 \.o=icOx
2、执行sql语句 # Mu<8`T-
1)用Statement来执行sql语句 ^w.]Hd2
String sql; w&%9IJ
Statement sm = cn.createStatement(); sa*g
sm.executeQuery(sql); // 执行数据查询语句(select) gNqAj# m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); axX{6
2)用PreparedStatement来执行sql语句 u t$c)_
String sql; j !`B'{cH
sql = "insert into user (id,name) values (?,?)"; $!f!,fw+
PreparedStatement ps = cn.prepareStatement(sql); IroPx#s:i
ps.setInt(1,xxx); /0(%(2jIWl
ps.setString(2,xxx); *ot>WVB
... FH.f- ZU
ResultSet rs = ps.executeQuery(); // 查询 1I ""X]I_
int c = ps.executeUpdate(); // 更新 "# !D|[h0
CphFv!k'Z
3、处理执行结果 _ Hc%4I
查询语句,返回记录集ResultSet ;`DD}j`
更新语句,返回数字,表示该更新影响的记录数 W RF.[R"
ResultSet的方法 0LdJZP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F>*{e
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +~N!9eMc
=~&VdPZ
4、释放连接 )>V?+L5M
cn.close(); gljo;f:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Vz{>cSz#
O5zE {#
可滚动、更新的记录集 H(b)aw^(%
1、创建可滚动、更新的Statement jXixVNw
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); e?b)p5g
该Statement取得的ResultSet就是可滚动的 5Q W}nRCZ
2、创建PreparedStatement时指定参数 ZWS2q4/S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 802H$P^ps
ResultSet.absolute(9000); V C-d0E0
批量更新 => qTNh*'
1、Statement A{N\)
Statement sm = cn.createStatement(); eNbpwne
sm.addBatch(sql1); 2VA!&`I
sm.addBatch(sql2); [KSH~:h:NR
... )qv2)a!H
sm.executeBatch() Tg0CE60"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 yrnv!moc%t
2、PreparedStatement `rlk|&T1
PreparedStatement ps = cn.preparedStatement(sql); vy[C'a
{ A|L'ih/
ps.setXXX(1,xxx); iPvuz7j=h
... (,B#t7ka
ps.addBatch(); f"dSr
} s3:9$.tiR[
ps.executeBatch(); O(c@PJem
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $5NKFJc
py
@(
<
事务的处理 l(!/Q|Q|
1、关闭Connection的自动提交 E"6X|I n
cn.setAutoCommit(false); :Wc_Utt
2、执行一系列sql语句 Qs%B'9")
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Wpr
,jN8b
Statement sm ; uR$i48}
sm = cn.createStatement(insert into user...); .t=
sm.executeUpdate(); ; b*i3*!g
sm.close(); Y%@hbUc}x9
sm = cn.createStatement("insert into corp...); eVJ^\z:4
sm.executeUpdate(); @ }&_Dvf
sm.close(); ml0*1Dw
3、提交 Z.1>
kZ
cn.commit(); 6@V~0DG
4、如果发生异常,那么回滚 v7,$7@$:\
cn.rollback();