java 数据库基本操作 Q1>zg,r
1、java数据库操作基本流程 qvt-
2、几个常用的重要技巧: xfSG~csoz
可滚动、更新的记录集 /'y5SlE[J
批量更新 i=v]:TOu
事务处理 fY2wDD
|ZU#IQVQfn
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S*%iiD)
1、取得数据库连接 # nfI%
1)用DriverManager取数据库连接 7SI)1_%G
例子 ke/_k/
String className,url,uid,pwd; W'_/6_c$!
className = "oracle.jdbc.driver.OracleDriver"; r@T| e
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; EaS~`
uid = "system"; S=gW(c2'
pwd = "manager"; 2w?G.pO#
Class.forName(className); dmR3Y.\jd
Connection cn = DriverManager.getConnection(url,uid,pwd); ]
mj
v;C
2)用jndi(java的命名和目录服务)方式 )u@t.)ChAV
例子 "E*8h/4u
String jndi = "jdbc/db"; }sMW3'V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i#,1iVSG
DataSource ds = (DataSource) ctx.lookup(jndi); Q2C)tVK+
Connection cn = ds.getConnection(); /BH.>R4`A
多用于jsp中 ~,}s(`~
2、执行sql语句 {Iy7.c8S
1)用Statement来执行sql语句 ^i<}]c_|f
String sql; ;mO,3dV
Statement sm = cn.createStatement(); L(WOet( '
sm.executeQuery(sql); // 执行数据查询语句(select) _g6m=N4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Sb^
b)q"
2)用PreparedStatement来执行sql语句 A|<;
String sql; |#TXE|#ux
sql = "insert into user (id,name) values (?,?)"; $cK^23H/Fj
PreparedStatement ps = cn.prepareStatement(sql); 7;HUE!5,^l
ps.setInt(1,xxx); ;.Zh,cU
ps.setString(2,xxx); N4 [E~-
... :$"7-a%f
ResultSet rs = ps.executeQuery(); // 查询 -[.PH M6+?
int c = ps.executeUpdate(); // 更新 TC-f%1(
GhnE>d;i
3、处理执行结果 $P?{O3:V
查询语句,返回记录集ResultSet o_yRn16
更新语句,返回数字,表示该更新影响的记录数 0&`}EXe<f
ResultSet的方法 #t5juX9Ho9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false b*9e1/]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
3t
;]h.m)~|
4、释放连接 hU,$|_WDy
cn.close(); 4]UT+'RubX
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection jA2ofC
v7@H\x*
可滚动、更新的记录集 Qp&?L"U)2
1、创建可滚动、更新的Statement
nhfwOS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F7uhuqA]N
该Statement取得的ResultSet就是可滚动的 +)-d_K.(k
2、创建PreparedStatement时指定参数 3%NE/lw1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); K<,Y^3]6?
ResultSet.absolute(9000); w2)/mSnu
批量更新 5X;?I/9
1、Statement }W
"(cYN_
Statement sm = cn.createStatement(); h}6b&m
sm.addBatch(sql1); i$#,XFFp~
sm.addBatch(sql2); ;a{rWz1Wm
... GUCM4jVT^
sm.executeBatch()
d]k='
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 mcMb*?]
2、PreparedStatement Z90Fcp:R
PreparedStatement ps = cn.preparedStatement(sql); Xr2J:1pgg
{ zjoo{IH}
ps.setXXX(1,xxx); ,#%SK;1<
... #5d8?n
ps.addBatch(); a97Csxf;7
} ^@ UjQ9[>
ps.executeBatch(); pSrsp r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h]C2 8=N
A}eOR=E
事务的处理 ocP*\NR
1、关闭Connection的自动提交 YnxU(v'\
cn.setAutoCommit(false); NhtEW0xCr
2、执行一系列sql语句 Y?.gfEXSQo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ij$)RSPtH
Statement sm ; NlFo$Y
sm = cn.createStatement(insert into user...); a&:>Ped"
sm.executeUpdate(); /a%KS3>V*
sm.close(); 9<qx!-s2rr
sm = cn.createStatement("insert into corp...); o@@w^##
sm.executeUpdate(); vUfO4yfdg
sm.close(); 5xv,!/@
3、提交 _U=S]2QW
cn.commit(); q/J3cXa{K
4、如果发生异常,那么回滚 (v|`LmV
cn.rollback();