java 数据库基本操作 d'ZNp2L
1、java数据库操作基本流程 s%K( hk
2、几个常用的重要技巧: dz([GP'-*
可滚动、更新的记录集 . &j+&
批量更新 )&j`5sSXcr
事务处理 dE_Xd:>
lEFd^@t
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Tt)z[^)%
1、取得数据库连接 0<\|D^m=&h
1)用DriverManager取数据库连接 R#4l"
例子 1$vG Q
String className,url,uid,pwd; 5N|LT8P}Z
className = "oracle.jdbc.driver.OracleDriver"; M.mn9kw`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nTr%S&<+"
uid = "system"; JpfA+r
pwd = "manager"; >[;@
[4}
Class.forName(className); F*PhV|XU
Connection cn = DriverManager.getConnection(url,uid,pwd); -/JEKwc
2)用jndi(java的命名和目录服务)方式 (^}t
例子 K/
On|C
String jndi = "jdbc/db"; !\7`I}:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); '37
{$VHw
DataSource ds = (DataSource) ctx.lookup(jndi); J#Hh4Kc
Connection cn = ds.getConnection(); H **tMq
多用于jsp中 uH9Vj<E$K
2、执行sql语句 O0qG
6a
1)用Statement来执行sql语句 FFcCoPX_
String sql; R}0gIp=
Statement sm = cn.createStatement(); imYfRi=$
sm.executeQuery(sql); // 执行数据查询语句(select) H<_Tn$<zH.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3s!6rT_=)d
2)用PreparedStatement来执行sql语句 k=mQG~
String sql; bu _ @>`S
sql = "insert into user (id,name) values (?,?)"; }MRgNr'k
PreparedStatement ps = cn.prepareStatement(sql); >6o <Q
ps.setInt(1,xxx); %`&n ;K.c
ps.setString(2,xxx); Z\IM~-
... y 9]d{:9
ResultSet rs = ps.executeQuery(); // 查询 lw9jk`7^
int c = ps.executeUpdate(); // 更新 ZxnPSA@%
\
=hg^j
3、处理执行结果 >+dSPI
查询语句,返回记录集ResultSet D j9aTO
更新语句,返回数字,表示该更新影响的记录数 7@;*e=v
ResultSet的方法 8/aJ4w[A
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m|
,Tk:xH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zas&gsl-;
]\xt[/?{
4、释放连接 OCx'cSs-=
cn.close(); PK:Lv15"r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection eVf D&&@
FTZ=u0
可滚动、更新的记录集 );.$`0
1、创建可滚动、更新的Statement 9xK>fM&u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gFTU9k<
该Statement取得的ResultSet就是可滚动的 71nZi`AR
2、创建PreparedStatement时指定参数 ]2@(^x'=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >`x|E-X"
ResultSet.absolute(9000); qIZ+%ZOu
批量更新 1$T`j2s
1、Statement !.j{vvQ/
Statement sm = cn.createStatement(); Qf=^CQ=lV
sm.addBatch(sql1); $vXY"-k
sm.addBatch(sql2); |D)CAQn,
... ]vQa~}
sm.executeBatch() _R\FB|_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?C2(q6X+s
2、PreparedStatement ,"`20.Lv
PreparedStatement ps = cn.preparedStatement(sql); E D>7
{ 5<(*
+mP`
ps.setXXX(1,xxx); w PR Ns9^
... &s`)_P[
ps.addBatch(); bPFGQlmIO
} B9"o Ru^}
ps.executeBatch(); HKJCiQ|k
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;I*t5{
kc2B_+Y1
事务的处理 t08U9`w
1、关闭Connection的自动提交 M$EF 8
cn.setAutoCommit(false); { }/
2、执行一系列sql语句 jI8`trD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @:zC!dR)G
Statement sm ; s1_Y~<yX
sm = cn.createStatement(insert into user...); $JOz7j(
sm.executeUpdate(); ,5c7jZ5H
sm.close(); ZvF#J_%gE5
sm = cn.createStatement("insert into corp...); .@&FJYkLYi
sm.executeUpdate(); Wmd@%K
sm.close(); nr]=O`Mvh
3、提交 %_E5B6xi{
cn.commit(); 66?`7j X
4、如果发生异常,那么回滚 %_Vz0
D!7
cn.rollback();