java 数据库基本操作 $m-rn'Q
1、java数据库操作基本流程 q|+`ihut
2、几个常用的重要技巧: T[YGQT|B
可滚动、更新的记录集 wJQ"|
批量更新 otgU6S7F
事务处理 ()>,L?y
%!i|"FNc
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EecV%E
1、取得数据库连接 fmhqm"
1)用DriverManager取数据库连接 x)<Hr,wd
例子 R~R ?0aq
String className,url,uid,pwd; h#>%\Pvt;
className = "oracle.jdbc.driver.OracleDriver"; ;{k`nv_6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; G*;6cV19
uid = "system"; eJ23$VM+9
pwd = "manager"; `:I<Jp
Class.forName(className); (yx9ox@rL
Connection cn = DriverManager.getConnection(url,uid,pwd); |NZVm}T
2)用jndi(java的命名和目录服务)方式 XeT{y]lkd
例子 &m>sGCZ
String jndi = "jdbc/db"; ?$#,h30
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); nBA0LIb
DataSource ds = (DataSource) ctx.lookup(jndi); ?{
0MF
Connection cn = ds.getConnection(); {yPiBu
多用于jsp中 hvS4"%\
2、执行sql语句 f2y:K6$'l*
1)用Statement来执行sql语句 (haYY]W\
String sql; U<*8KiI
Statement sm = cn.createStatement(); 0ThX1)SH
sm.executeQuery(sql); // 执行数据查询语句(select) I;<aJo6Yl
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); EhOy<f[4W
2)用PreparedStatement来执行sql语句 sX~
`Vn&
String sql; m%bw$hr
sql = "insert into user (id,name) values (?,?)"; :sY pZX1
PreparedStatement ps = cn.prepareStatement(sql); XJ`!d\WL/!
ps.setInt(1,xxx); x(Us
O}
ps.setString(2,xxx); 0Lo)Ni^"
... fQ,L~:Y =
ResultSet rs = ps.executeQuery(); // 查询 rIt#ps
int c = ps.executeUpdate(); // 更新 : 6*FnKD
*)jhhw=34
3、处理执行结果 M;{btu^a
查询语句,返回记录集ResultSet c9eLNVM
更新语句,返回数字,表示该更新影响的记录数 kq
SpZoV0'
ResultSet的方法 Nn_n@K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zNs8yMnFr
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 s]"NqwIPK
f;nO$h[Qb
4、释放连接 kT+Idu
cn.close(); X. =%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6jKZ.S+s)
.qcIl)3
可滚动、更新的记录集 _U"9#<
1、创建可滚动、更新的Statement Q3$AL@".
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;ss,x
该Statement取得的ResultSet就是可滚动的 uq>\pO&P
2、创建PreparedStatement时指定参数 &pCNOHi|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [a<ucJ
ResultSet.absolute(9000); XPhC*r
批量更新 )r)3.|wJm
1、Statement s
9Y'MQo*
Statement sm = cn.createStatement(); /2!Wy6p
sm.addBatch(sql1); 5VU
5kiCt
sm.addBatch(sql2); 8pQx6QE
... \C
)S3!h
sm.executeBatch() QD6in>+B@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (Mk9##R#
2、PreparedStatement |Mj2lZS
PreparedStatement ps = cn.preparedStatement(sql); (W~')A"hC'
{ \D9J!K82
ps.setXXX(1,xxx); oM&}akPE
... c?;YufH'j
ps.addBatch(); !5hNG('f
} }J~
d6m
ps.executeBatch(); R<J1bH1n3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 p6MjVu
c /G4@D>
事务的处理 7Z#r9Vr
1、关闭Connection的自动提交 o~vUqj?BA
cn.setAutoCommit(false); ID-Y*
2、执行一系列sql语句 J\kGD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \lJCBb+k
Statement sm ; eCDwY:t`
sm = cn.createStatement(insert into user...); 5@Y rtZI
sm.executeUpdate(); h& t/
L
sm.close(); Pp*:rA"N
sm = cn.createStatement("insert into corp...); < )dqv0=
sm.executeUpdate(); ]Kutuf$t
sm.close(); Y;X_E7U
3、提交 <}G*/ z?/
cn.commit(); 0%Y8M` ~s7
4、如果发生异常,那么回滚 +:a#+]g
cn.rollback();