java 数据库基本操作 DGwN*>X
1、java数据库操作基本流程 :OVre*j
2、几个常用的重要技巧: -K_p?
l
可滚动、更新的记录集 &l=%*`On
批量更新 M=hH:[6 &
事务处理 >7VOytc
W5_:Q@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y70[Nz
1、取得数据库连接 %\
i 7
1)用DriverManager取数据库连接 V2I"m
例子 4Em mh=A
String className,url,uid,pwd; X&[S.$_U
className = "oracle.jdbc.driver.OracleDriver"; $`Z-,AJc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hwaU;> F
uid = "system"; $EB&]t+
pwd = "manager"; k(oHmw
Class.forName(className); !c+Nf2I7S
Connection cn = DriverManager.getConnection(url,uid,pwd); Z. ))=w6G
2)用jndi(java的命名和目录服务)方式 VV*Z5U@b
例子 TRl,L5wd-?
String jndi = "jdbc/db"; e `!PQMLU
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1N_Gk&
DataSource ds = (DataSource) ctx.lookup(jndi); R7o3X,-iwn
Connection cn = ds.getConnection(); * ?a-m\
多用于jsp中 G $TLWfm
2、执行sql语句 cu4&*{
1)用Statement来执行sql语句 8X@p?43
String sql; S0\;FmLIc
Statement sm = cn.createStatement(); bm>,$GW(
sm.executeQuery(sql); // 执行数据查询语句(select) E*ug.nxy
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); K 9ytot
2)用PreparedStatement来执行sql语句 'E{n1[b
String sql; @?$x
sql = "insert into user (id,name) values (?,?)"; <6]TazW?S
PreparedStatement ps = cn.prepareStatement(sql); 3iHUG^sLW
ps.setInt(1,xxx); hlpi-oW`
ps.setString(2,xxx); iyF~:[8
... p`jkyi
ResultSet rs = ps.executeQuery(); // 查询 bqHR~4 #IR
int c = ps.executeUpdate(); // 更新 2g elmQnc
FC:Z9 {2!
3、处理执行结果 |0A"3w
查询语句,返回记录集ResultSet 4L RrrW
更新语句,返回数字,表示该更新影响的记录数 vps</f!
ResultSet的方法 v2e*mNK5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =l_B58wrx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .Vm!Ng )j
_;G. QwHr
4、释放连接 ,9I %t%sb
cn.close(); uXX3IE[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection o5 UM)g
+>#SB"'
可滚动、更新的记录集 v=A]#O%
1、创建可滚动、更新的Statement zI5#'<n
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7~@9=e8G
该Statement取得的ResultSet就是可滚动的 #V[j Q Vl
2、创建PreparedStatement时指定参数 d{cd+An
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Bb5|+bP
ResultSet.absolute(9000); t6GL/M4
批量更新 )[d?&GK
1、Statement 9 )1 8
Statement sm = cn.createStatement(); v+.
n9
sm.addBatch(sql1); *9#6N2J$M
sm.addBatch(sql2); 4l/hh|3@
... d
NQ?8P-&
sm.executeBatch() Yj/aa0Ka4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >wz&{9ni
2、PreparedStatement _g|zDi^
PreparedStatement ps = cn.preparedStatement(sql); u^DfRd&P0
{ yrp5\k*{y
ps.setXXX(1,xxx); hk
=nXv2M
... D#ZzhHHP
ps.addBatch(); ;GW[Yw>Rz
} i6L>,^Dg
ps.executeBatch(); `nAR/Ye
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;JM%O8
q\2q3}n
事务的处理 B?BB
1、关闭Connection的自动提交 m0}Pq{g
cn.setAutoCommit(false); B$R"Ntp
2、执行一系列sql语句 {E6M_qZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xbbQ)sH&m
Statement sm ; y0!-].5UH
sm = cn.createStatement(insert into user...); ^}JGWGib=+
sm.executeUpdate(); "gD]K=
sm.close(); E8_j?X1
sm = cn.createStatement("insert into corp...); kD&%
7Vz
sm.executeUpdate(); ^P4q6BW
sm.close(); T5*
t~`bfU
3、提交 !S0$W?*
cn.commit(); K4\{G
4、如果发生异常,那么回滚 rI/;L<c
cn.rollback();