java 数据库基本操作 1$?O5.X:
1、java数据库操作基本流程 h|m h_T{+
2、几个常用的重要技巧: *5sr\b4#S
可滚动、更新的记录集 K=M5d^K<E
批量更新 NtkEb :
事务处理 .<^dv?@
l~AmHw
e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,*?bET
$
1、取得数据库连接 zv||&Hi
1)用DriverManager取数据库连接 ZGSb&!Ke
例子 R0_%M
String className,url,uid,pwd; X3%7VFy9
className = "oracle.jdbc.driver.OracleDriver"; U%"c@%B0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; BM&95p
uid = "system"; ~0>g 4
D.
pwd = "manager"; !FZb3U@
Class.forName(className);
;B o 2$
Connection cn = DriverManager.getConnection(url,uid,pwd); YMj
z,N
2)用jndi(java的命名和目录服务)方式 ueDG1)
例子 k]lM%
String jndi = "jdbc/db"; Yb]eWLv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *5hg}[n2
DataSource ds = (DataSource) ctx.lookup(jndi); !h}x,=`z/
Connection cn = ds.getConnection(); ]}i_Nq W)
多用于jsp中 V9I5/~0c
2、执行sql语句 @sav8]
1)用Statement来执行sql语句 3%|LMX]M5_
String sql; jl{>>TW{x
Statement sm = cn.createStatement(); k+'Rh'>
sm.executeQuery(sql); // 执行数据查询语句(select) YDyOhv
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |s+[489g'6
2)用PreparedStatement来执行sql语句 8k2prv^
String sql; zIf/j k
sql = "insert into user (id,name) values (?,?)"; J1YP-:
PreparedStatement ps = cn.prepareStatement(sql); ,m{Zn"?kS
ps.setInt(1,xxx); ]L^X}[SH
ps.setString(2,xxx); l131^48U
... ~ULuX"n
ResultSet rs = ps.executeQuery(); // 查询 =<y$5"|
int c = ps.executeUpdate(); // 更新 mNc(
:@KWp{ D7
3、处理执行结果 `XB(d@%
查询语句,返回记录集ResultSet *eH[~4
更新语句,返回数字,表示该更新影响的记录数 -i:Zi}f
ResultSet的方法 ha1 J^e
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R}8!~Ma`|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `LVItP(GUM
&Zs h-|N
4、释放连接 {vx{Hwyv
cn.close(); aDm$^yP
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,jQkR^]j-
}N#jA yp!
可滚动、更新的记录集 s7tNAj bgD
1、创建可滚动、更新的Statement 15x~[?!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); d2&sl(O
该Statement取得的ResultSet就是可滚动的 `][~0\Y3m
2、创建PreparedStatement时指定参数 6vQAeuz<Fq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); KVvIo1$N
ResultSet.absolute(9000); MScjq
批量更新 iS&fp[Th
1、Statement 8&qCH>Cf
Statement sm = cn.createStatement(); `E8m>q Ss
sm.addBatch(sql1); eVjr/nm
sm.addBatch(sql2); 2BS2$#c>
... S)C =Q~&
sm.executeBatch() T12?'JL^r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 n9<QSX&~<
2、PreparedStatement e]!C
Aj7uS
PreparedStatement ps = cn.preparedStatement(sql); P+:FiVj@~
{ &1ASWllD
ps.setXXX(1,xxx); kn 5q1^
... m4<8v
ps.addBatch(); usZmf=p-r
} ,v4Z[ (
ps.executeBatch(); QzT )PtX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;-~Wfh+
~QJD.'z
事务的处理 !sfOde)$
1、关闭Connection的自动提交 Se9I1~mX
cn.setAutoCommit(false); :aV(i.LW
2、执行一系列sql语句 O _yJR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9IIQon
Statement sm ; Vz1ro
sm = cn.createStatement(insert into user...); lj/?P9
sm.executeUpdate(); i*:lZ eU61
sm.close(); v}Gq.(b
sm = cn.createStatement("insert into corp...); j/TsHJ=
sm.executeUpdate(); -MbnYs)
sm.close(); hzg&OW=:
3、提交 FTI[YR8?Y
cn.commit(); 5JK{dis]k
4、如果发生异常,那么回滚 b7E= u0
cn.rollback();