java 数据库基本操作 >FVBn;1
1、java数据库操作基本流程 Io|3zE*<
2、几个常用的重要技巧: q X"Pg
可滚动、更新的记录集 F9Hxqa#1T
批量更新 St1Ny,$yU
事务处理 G^G= .9O
&V`~ z
e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9+"R}Nxv^
1、取得数据库连接 6T?$m7c
1)用DriverManager取数据库连接 X
j>?P/=Z
例子 Oc
Gg'R7
String className,url,uid,pwd; rZij[6]Y^
className = "oracle.jdbc.driver.OracleDriver"; 0eGz|J*7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !-cO0c!
uid = "system"; oMb&a0-7u
pwd = "manager"; jkVX>*.|oy
Class.forName(className); Y<]A5cm
Connection cn = DriverManager.getConnection(url,uid,pwd); .T>^bLuFy
2)用jndi(java的命名和目录服务)方式 (~6D`g`B
例子 ;JD/4:
String jndi = "jdbc/db"; (bX77 Xr
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 'l sG?
DataSource ds = (DataSource) ctx.lookup(jndi); T3_3k.,|
Connection cn = ds.getConnection(); ;R_H8vp
多用于jsp中 >FR;Ux~a
2、执行sql语句 KW&vX%i(.
1)用Statement来执行sql语句 Z[,A>tJ
String sql; z]twh&^1L
Statement sm = cn.createStatement(); P^)J^{r
sm.executeQuery(sql); // 执行数据查询语句(select) e5s=@-[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }akF=/M
2)用PreparedStatement来执行sql语句 R0WI s:k2
String sql; nlq"OzcH04
sql = "insert into user (id,name) values (?,?)"; `y^tCJ2u*
PreparedStatement ps = cn.prepareStatement(sql); .|VWYN
ps.setInt(1,xxx); NwISf
ps.setString(2,xxx); <Z>p1S
... 8mmHefZ}2!
ResultSet rs = ps.executeQuery(); // 查询 h1(GzL%i_
int c = ps.executeUpdate(); // 更新 oMUyP~1
CJ~gE"
3、处理执行结果 tO@n3"O
查询语句,返回记录集ResultSet ~jpdDV&u\
更新语句,返回数字,表示该更新影响的记录数 ru#CywK{{;
ResultSet的方法 7 {n>0@_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dsUt[z1w5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [PhT
zXt
ta*6xpz-\Q
4、释放连接 O>M4%p
cn.close(); ?a]1$>r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3G.-JLhs
smJ#.I6/L
可滚动、更新的记录集 ] 'B4O1
1、创建可滚动、更新的Statement 8HaBil
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Z8vR/
该Statement取得的ResultSet就是可滚动的 \7d T]VV
2、创建PreparedStatement时指定参数 ju8DmC5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Qp5YS
ResultSet.absolute(9000); *#| lhf'
批量更新 TwT@_~IM
1、Statement <y!(X"n`
Statement sm = cn.createStatement(); 79bt%P
sm.addBatch(sql1); !</Snsi
sm.addBatch(sql2); Jg2*$gL;_
... ?O| CY
sm.executeBatch() a9sbB0q-K@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &x#3N=c#
2、PreparedStatement ,WKWin
PreparedStatement ps = cn.preparedStatement(sql); 9EU0R
H
{ u]uUm1Er
ps.setXXX(1,xxx); "Xz [|Xl
... 'Cp]Q@]\
ps.addBatch(); ]iHSUP
} ^rX5C2}G\D
ps.executeBatch(); "?f_U/+D<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <`P7^
'z!
AnD#k]
事务的处理 #
VAL\Z
1、关闭Connection的自动提交 sq;nUA=
cn.setAutoCommit(false); lI&5.,2MP
2、执行一系列sql语句 p4sU:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =*\(Y(0
Statement sm ; H2iC? cSR
sm = cn.createStatement(insert into user...); 6$ \69
sm.executeUpdate(); "P9SW?',
sm.close(); FhAYk
sm = cn.createStatement("insert into corp...); X[;-SXq
sm.executeUpdate(); iYR`|PJi
sm.close(); 7FYq6wi
3、提交 D3.$Vl,.
cn.commit(); 7+c}D>/`:
4、如果发生异常,那么回滚 1<n'F
H3
cn.rollback();