java 数据库基本操作 v qt#JdPp9
1、java数据库操作基本流程 '|I8byiK
2、几个常用的重要技巧: xRX2u_f$<
可滚动、更新的记录集 jR1o<]?
批量更新 J0ysZ]
事务处理 lOp7rW]$
Oe)d|6=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &kR*J<)V
1、取得数据库连接 KKBrw+)AJ
1)用DriverManager取数据库连接 S55h}5Y
例子 f`$F^=
String className,url,uid,pwd; ,4Q1[K35B
className = "oracle.jdbc.driver.OracleDriver"; h23"<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Fy;
sVB
uid = "system"; ,Y:ET1:
pwd = "manager"; fY4I(~Q
Class.forName(className); ~ u)}/
Connection cn = DriverManager.getConnection(url,uid,pwd); W)_|jpd[
2)用jndi(java的命名和目录服务)方式 Bj=lUn`T:
例子 Fb!Ew`;QT
String jndi = "jdbc/db"; i,H(6NL.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i/C`]1R/
DataSource ds = (DataSource) ctx.lookup(jndi); }508wwv
Connection cn = ds.getConnection(); \aN*x
多用于jsp中
':>u*
2、执行sql语句 t3qPocYQ
1)用Statement来执行sql语句 Silh[8
String sql; X[ 6#J
Statement sm = cn.createStatement(); OH\(;RN*
sm.executeQuery(sql); // 执行数据查询语句(select) DruiiA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kF;N}O2?{
2)用PreparedStatement来执行sql语句 JdM0f!3
String sql; rAn:hR{
sql = "insert into user (id,name) values (?,?)"; +]3kcm7B
PreparedStatement ps = cn.prepareStatement(sql); *;&[q{hz
ps.setInt(1,xxx); i_c'E;|
ps.setString(2,xxx); khc1<BBsT
... n5DS
ResultSet rs = ps.executeQuery(); // 查询 fN_qJm#:$y
int c = ps.executeUpdate(); // 更新 P=[_W;->}
E/3i_R
3、处理执行结果 _qxBjB4t"a
查询语句,返回记录集ResultSet 2zV{I*
更新语句,返回数字,表示该更新影响的记录数 33=lR-N#
ResultSet的方法 y}F;~H~P
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6MD9DqD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $} @gR]
Z
EKD?j
4、释放连接 QZm7
Q4
cn.close(); 8\X-]Gh\^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sTxgU !_
T4nWK!}z
可滚动、更新的记录集 \8Hs[H!
1、创建可滚动、更新的Statement 0clq}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '5m4kDs
该Statement取得的ResultSet就是可滚动的 *mJ\Tzc)
2、创建PreparedStatement时指定参数 *N|ak =
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :I{9k~
ResultSet.absolute(9000); i'QR-B&Z
批量更新 F%:74.]Y
1、Statement bzXeG;c<7
Statement sm = cn.createStatement(); A+MG?k>yg
sm.addBatch(sql1); i5,yrPF
sm.addBatch(sql2); 6l PuYEmT
... 3L CT-rp
sm.executeBatch() ;:,U]@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TILH[r&Jg
2、PreparedStatement rE Me=>^
PreparedStatement ps = cn.preparedStatement(sql); v:P=t2q
{ S"t\LB*'Ls
ps.setXXX(1,xxx); jqj4(J@%yr
... o%,?v
9
ps.addBatch(); %>y`VN
D
} y=aWSb2y'
ps.executeBatch(); kWacc&*|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .Y0O.
va:<W H
事务的处理 6V"uovN2
1、关闭Connection的自动提交 gBO,
cn.setAutoCommit(false); GkIhPn(d
2、执行一系列sql语句 EOZ 6F-':
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Dkx}}E:<
Statement sm ; `fOp>S^Q4
sm = cn.createStatement(insert into user...); BIS .,
sm.executeUpdate(); MGf *+!y,
sm.close(); f62rm[
sm = cn.createStatement("insert into corp...); qW4DW4
sm.executeUpdate(); tLU@&NY`
sm.close(); $) M2
3、提交 nLOK1@,4
cn.commit(); P3IBi_YyG1
4、如果发生异常,那么回滚 }.pqV
X{d
cn.rollback();