java 数据库基本操作 iY/2 `R
1、java数据库操作基本流程 xH\\#4/
2、几个常用的重要技巧: |gI>Sp%Fu
可滚动、更新的记录集 lo>9 \ Po
批量更新 .4\I?
事务处理 eR \duZ!`
nDdY~f.B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %]}JWXof
1、取得数据库连接 5zBA ]1PY
1)用DriverManager取数据库连接 Kg';[G\
例子 x9>$197
String className,url,uid,pwd; J[:#(c&c!1
className = "oracle.jdbc.driver.OracleDriver"; R 9`[C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [@lK[7 u
uid = "system"; -+@N/d5
pwd = "manager"; cEu_p2(7!B
Class.forName(className); V\zcv @
Connection cn = DriverManager.getConnection(url,uid,pwd); "O>~osj
2)用jndi(java的命名和目录服务)方式 I>FL&E@K
例子 m8F$h-
String jndi = "jdbc/db"; yZ6WbI8n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QD,m`7(
DataSource ds = (DataSource) ctx.lookup(jndi); G,!j P2S
Connection cn = ds.getConnection(); ;)FvTm'"\.
多用于jsp中 wA$7SWC
2、执行sql语句 zK~8@{l}_"
1)用Statement来执行sql语句 >
Hv9Xz
String sql; 6Sd:5eTEQ
Statement sm = cn.createStatement(); =F_uK7W
sm.executeQuery(sql); // 执行数据查询语句(select) P1[.[q/-e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); A^,ul>!
2)用PreparedStatement来执行sql语句 ;xiN<f4B
String sql; Jn{)CZ
sql = "insert into user (id,name) values (?,?)"; THq}>QI
PreparedStatement ps = cn.prepareStatement(sql); (E0WZ$f}
ps.setInt(1,xxx); \(Rj2
ps.setString(2,xxx); V]--d33/a
... 0J'^<GTL
ResultSet rs = ps.executeQuery(); // 查询 #d % v=.1
int c = ps.executeUpdate(); // 更新 CrI<rD%'
|u%;"N'p)
3、处理执行结果 LAc60^t1
查询语句,返回记录集ResultSet 1oO(;--u_
更新语句,返回数字,表示该更新影响的记录数 S*G^U1Sc+
ResultSet的方法 X[?fU&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,M`1 k
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `/T.u&QF
Ag0
6M U
4、释放连接 <7`k[~)VB
cn.close(); /95z1e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Rp2h[_>
Z#u{th
可滚动、更新的记录集 &w^9#L
1、创建可滚动、更新的Statement /F.<Gz;w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :7X4VHw/
该Statement取得的ResultSet就是可滚动的 iuWUr?`\
2、创建PreparedStatement时指定参数 @:w^j0+h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); UBW,Q+Q
ResultSet.absolute(9000); !j7mY9x+
批量更新 ]+,L/P
1、Statement [H\0
'
Statement sm = cn.createStatement(); Zq33R`
sm.addBatch(sql1); L=;T$4+p
sm.addBatch(sql2); TqN@l\
... `%[m%Y9h
sm.executeBatch() uy2~<)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 F/Js K&&
2、PreparedStatement H5d@TB,`
PreparedStatement ps = cn.preparedStatement(sql); =),ZZD#J
{ +(x(Ybl#
ps.setXXX(1,xxx); nt_Cb*K<
... U= GJuixy
ps.addBatch();
3-{WFnA
} 9+*{3 t
ps.executeBatch(); Il\{m?Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;C =d(
pY
k {{eyC
事务的处理 ,^
,R .T
1、关闭Connection的自动提交 j@nK6`d+1
cn.setAutoCommit(false); 1Bs t|
2、执行一系列sql语句 bO$KV"*!
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close q}jh>`d
Statement sm ; Edc3YSg%;
sm = cn.createStatement(insert into user...); IX
6 jb"
sm.executeUpdate(); hyPS 6Y'1
sm.close(); {TJ"O
sm = cn.createStatement("insert into corp...); g'k m*EV
sm.executeUpdate(); =_E$* }
sm.close(); xv>8rW(Np5
3、提交 oJ5n*[qUI
cn.commit(); FDF DB
4、如果发生异常,那么回滚 "}0QxogYE
cn.rollback();