java 数据库基本操作 h<<v^+m
1、java数据库操作基本流程 ysY*k` 5
2、几个常用的重要技巧: /N.U/MPL_
可滚动、更新的记录集 5`p.#
批量更新 uoh7Sz5!^
事务处理 ]:J$w]\
p9-K_dw3X@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 AFwdJte9e
1、取得数据库连接 uQKT
1)用DriverManager取数据库连接 63IM]J
例子 z+X}HL
String className,url,uid,pwd; b@hqz!)l`
className = "oracle.jdbc.driver.OracleDriver"; '!B&:X)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J5,9_uo]
uid = "system"; =[ 7A v>
pwd = "manager"; /Lr.e%
Class.forName(className); <lJ345Q
Connection cn = DriverManager.getConnection(url,uid,pwd); l9Q-iJ
2)用jndi(java的命名和目录服务)方式 ~})e?q;b
例子 (X*^dO
String jndi = "jdbc/db"; MkXmA`cP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y(Hs #Kn{
DataSource ds = (DataSource) ctx.lookup(jndi); 0?|<I{z2
Connection cn = ds.getConnection(); *.w9c
多用于jsp中 Z6MO^_m2
2、执行sql语句 O+x!Bg7
1)用Statement来执行sql语句 +X
88;-
String sql; yyTnL 2Y9
Statement sm = cn.createStatement(); /PXzwP_(A
sm.executeQuery(sql); // 执行数据查询语句(select) EQSQFRk;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2&J)dtqz
2)用PreparedStatement来执行sql语句 5146kp|1
String sql; mgU<htMr1
sql = "insert into user (id,name) values (?,?)"; 5L}/&^E#p
PreparedStatement ps = cn.prepareStatement(sql); ]JQULE)
ps.setInt(1,xxx); m+z&Q
ps.setString(2,xxx); vo{--+{ky!
... %JTpI`
ResultSet rs = ps.executeQuery(); // 查询 4 s9LB
int c = ps.executeUpdate(); // 更新 t\O16O7S
;*2Cm'8E
3、处理执行结果 }4X0epPp;:
查询语句,返回记录集ResultSet ]7c=PC
更新语句,返回数字,表示该更新影响的记录数 R`-S/C
ResultSet的方法 MVUJD{X#
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zX i'kB
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A?OQE9'
JC}D`h
4、释放连接
|-~Y#]
cn.close(); Pr
C{'XDlU
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a(ZcmYzXU
y$M%2mh`
可滚动、更新的记录集 =:U`k0rn!
1、创建可滚动、更新的Statement +:/%3}`
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <
I``&>
该Statement取得的ResultSet就是可滚动的 as=fCuJ
2、创建PreparedStatement时指定参数 DzRFMYBR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {?7Uj
ResultSet.absolute(9000); + Vdpy(
批量更新 NDokSw-
1、Statement cPQiUU~W@
Statement sm = cn.createStatement(); YtLt*Ig%
sm.addBatch(sql1); ti,d&c_7
sm.addBatch(sql2); Q\0'lQJdy
... E' uZA
sm.executeBatch() ;}p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +jgSV.N
2、PreparedStatement hOK8(U0
PreparedStatement ps = cn.preparedStatement(sql); n~Lt\K:
{ ]T) 'Hb
ps.setXXX(1,xxx); _DEjF)S
... [()koU#w.
ps.addBatch(); 3=V&K-
} %J-GKpo/S
ps.executeBatch(); X2"/%!65{
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Yx`n:0
dqcL]e
事务的处理 @>7%qS
1、关闭Connection的自动提交 `">=
cn.setAutoCommit(false); ]hV*r@d
2、执行一系列sql语句 &BSn?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close iH'p>s5L
Statement sm ; X"*5+* z]
sm = cn.createStatement(insert into user...); akTk(
sm.executeUpdate(); RPbZ(.
sm.close(); +aAc9'k
sm = cn.createStatement("insert into corp...); I5W~g.<6
sm.executeUpdate(); ;5AcFB
sm.close(); xD=csJ'(
3、提交 ?Z} &EH
cn.commit(); EKN~H$.
4、如果发生异常,那么回滚 HjwE+: w
cn.rollback();