java 数据库基本操作 mkj;PYa
1、java数据库操作基本流程 I =tyQ`
2、几个常用的重要技巧: #{)r*"%
可滚动、更新的记录集 jkQt'!
批量更新 =sUl`L+w,L
事务处理 #Lhj0M;a
;Sx'O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Xh7~MU~X
1、取得数据库连接 'XZI{q2i
1)用DriverManager取数据库连接 h a,=LV
例子 6)uPM"cO
String className,url,uid,pwd; ?d>P+).
className = "oracle.jdbc.driver.OracleDriver"; *MnG-\{j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^hl]s?"3
uid = "system"; 1Rb XM n
pwd = "manager"; :XPC0^4s
Class.forName(className); E&s'uE=w+
Connection cn = DriverManager.getConnection(url,uid,pwd); 5 CY_Ay\
2)用jndi(java的命名和目录服务)方式 aUIc=Z
例子 |&0"N[t
String jndi = "jdbc/db"; E.H,1 {
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); sw=JUfAhy
DataSource ds = (DataSource) ctx.lookup(jndi); },Re5W nl
Connection cn = ds.getConnection(); 90y9~.v
多用于jsp中 T je o*n^
2、执行sql语句 R[>;_}5">
1)用Statement来执行sql语句 gvTOCF
String sql; :EQme0OW
Statement sm = cn.createStatement(); aCYm$6LmA
sm.executeQuery(sql); // 执行数据查询语句(select) 8}pcanPg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +GYI2
2)用PreparedStatement来执行sql语句 lEYT{
String sql; t6h`WAZV
sql = "insert into user (id,name) values (?,?)"; f9l<$l
PreparedStatement ps = cn.prepareStatement(sql); aG8D%i0
ps.setInt(1,xxx); HgSmAziv
ps.setString(2,xxx); $cJN9|$6
... eMm~7\
R
ResultSet rs = ps.executeQuery(); // 查询 \@}$Wjsl
int c = ps.executeUpdate(); // 更新 C)KtM YA,
fN"oa>X
3、处理执行结果 O"J.k&C<,
查询语句,返回记录集ResultSet c~L6fvS
更新语句,返回数字,表示该更新影响的记录数 -t~B@%
ResultSet的方法 +U_-Lq )
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <zDw&s2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y?vm%t`K
"{ QHWZ
4、释放连接 wD?=u\% &
cn.close(); ap'kxOf"1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R
!%m5Q?5
~4 ~Tcn
可滚动、更新的记录集 @Z=|$*9
1、创建可滚动、更新的Statement MZP><Je&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); u<y\iZ[
该Statement取得的ResultSet就是可滚动的 6P*)rye
2、创建PreparedStatement时指定参数 j3[OY
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^? {kj{v
ResultSet.absolute(9000); h%w\O Z7
批量更新 2E;%=e
1、Statement ZesD(
Statement sm = cn.createStatement(); dzv,)X
sm.addBatch(sql1); dYqDL<se/I
sm.addBatch(sql2); vBn=bb'W
... ]qza*ba
sm.executeBatch() ~Yz/t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $9i5<16
2、PreparedStatement HToN+z%w3H
PreparedStatement ps = cn.preparedStatement(sql); qM:)daS1w
{ $}UJs <-F
ps.setXXX(1,xxx); |16BidWi
... +@)$l+kk9
ps.addBatch(); 8}#Lo9:,d
} ,WDAcQ8\
ps.executeBatch(); OI}HvgV^!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =+-.5M
4p.{G%h
事务的处理 Jx9%8Ek
1、关闭Connection的自动提交 &CmkNm_B
cn.setAutoCommit(false); K9M.+d4
2、执行一系列sql语句 |AfQ_iT6c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .z>." `
Statement sm ; x-#9i
sm = cn.createStatement(insert into user...); 5)v^
cR?&
sm.executeUpdate(); '*ICGKoT
sm.close(); "l,EcZRjTz
sm = cn.createStatement("insert into corp...); 0S7Isk2W
sm.executeUpdate(); # +]! u%n
sm.close(); BBJ]>lQ
3、提交 vhEs +j
cn.commit(); jTgh+j]AP
4、如果发生异常,那么回滚 JI,hy
<3l0
cn.rollback();