java 数据库基本操作 45+%K@@x
1、java数据库操作基本流程 5K ,#4EOV
2、几个常用的重要技巧: Wyq~:vU.S
可滚动、更新的记录集 3xzkZ8]/
批量更新 fzS`dL5,W
事务处理 mGe|8In
GjeUUmr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9:%n=U Rd
1、取得数据库连接 `D)Lzm R
1)用DriverManager取数据库连接 ,]Ro',A&
例子 (/SGT$#8
String className,url,uid,pwd; P1i*u0a
className = "oracle.jdbc.driver.OracleDriver"; ^}o7*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; SY'2A)
uid = "system"; x*h?%egB!p
pwd = "manager"; [Y$5zeA
Class.forName(className); 3duG.iUlL
Connection cn = DriverManager.getConnection(url,uid,pwd); zUs~V`0
2)用jndi(java的命名和目录服务)方式 `k(u:yGK
例子 }qiF^D}
String jndi = "jdbc/db"; \9] I#Ih}M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X%GD0h]X#
DataSource ds = (DataSource) ctx.lookup(jndi); s!#HZK
Connection cn = ds.getConnection(); zb5N,!%r
多用于jsp中 Xb]=:x(
2、执行sql语句 I( ]BMMj
1)用Statement来执行sql语句 T~%H%O(F
String sql; sn-)(XU!
Statement sm = cn.createStatement(); ~^I\crx,U%
sm.executeQuery(sql); // 执行数据查询语句(select) jow7t\wk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); OGJ=VQA
2)用PreparedStatement来执行sql语句 Y5ogi)
String sql; iW|s|1mh3
sql = "insert into user (id,name) values (?,?)"; ge0's+E+1
PreparedStatement ps = cn.prepareStatement(sql); K8
b+
ps.setInt(1,xxx); =2
&hQd
ps.setString(2,xxx); l#D-q/k?
... z wL3,!t
ResultSet rs = ps.executeQuery(); // 查询 A3AP51
!
int c = ps.executeUpdate(); // 更新 M o}H_8y
T&r +G!2
3、处理执行结果 e(yQKwVD
查询语句,返回记录集ResultSet 1$$37?FE
更新语句,返回数字,表示该更新影响的记录数 {ITv&5?>
ResultSet的方法 5-D`<\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false d/XlV]#2x\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A7k'K4
O)`fvpVU
4、释放连接 6hkkNXqkf
cn.close(); [N)#/6j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection oi2J:Y4
YywEZ?X
可滚动、更新的记录集 ],8;eq%W)
1、创建可滚动、更新的Statement E:
9o;JU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _QR
g7
该Statement取得的ResultSet就是可滚动的 8>UKIdp
2、创建PreparedStatement时指定参数 b5AGk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F:%^&%\
ResultSet.absolute(9000); M
h`CP
批量更新 k$C"xg2
1、Statement mCM|&u
Statement sm = cn.createStatement(); l8z%\p5cR
sm.addBatch(sql1); 6W5d7`A
sm.addBatch(sql2); Lf
>YdD
... 4s9c#nVlu
sm.executeBatch() YgCc|W3{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $v]T8|h
2、PreparedStatement o2DtCU-A
PreparedStatement ps = cn.preparedStatement(sql); jFtg.SD
{ $#5klA
ps.setXXX(1,xxx); Bi]D{m9
... ~}BJ0P(VMc
ps.addBatch(); vXephR'
} W1vCN31
ps.executeBatch(); Fse['O~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 eY
T8$
M[~Jaxw%
事务的处理 b SQRLxF
1、关闭Connection的自动提交 O -G1})$
cn.setAutoCommit(false); TWUUvj`.
2、执行一系列sql语句 AzZJG v]H
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1e/L\Y=m
Statement sm ; l '/N3&5
sm = cn.createStatement(insert into user...); !g8*r"[UJ
sm.executeUpdate(); \M9h&I\7
sm.close(); [*Q-nZ/L
sm = cn.createStatement("insert into corp...); }mKwFVZ
sm.executeUpdate(); Zvxp%dES
sm.close(); pA<eTlH
3、提交 t\8&*(&3F
cn.commit(); C1d
04Q
4、如果发生异常,那么回滚 'Q5&5UrBr
cn.rollback();