java 数据库基本操作 j/Kul}Ml\*
1、java数据库操作基本流程 I]HYqI
2、几个常用的重要技巧: GNW$:=0u
可滚动、更新的记录集 "I=Lbh-`
批量更新 yHY2 SXm
事务处理 m<n+1
A6KP(@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &v]xYb)+<
1、取得数据库连接 t,Tq3zB
1)用DriverManager取数据库连接 C,ldi"|
例子 .P8m%$'N
String className,url,uid,pwd; =n.&N
className = "oracle.jdbc.driver.OracleDriver"; tG]W!\C'h
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; c
CjN8<
uid = "system"; ^E,
#}cW
pwd = "manager"; XFFm'W6@
Class.forName(className); :tENn
r.9v
Connection cn = DriverManager.getConnection(url,uid,pwd); zq5N@dF
2)用jndi(java的命名和目录服务)方式 UChLWf|'
例子 M\ wCZG
String jndi = "jdbc/db"; ,wr5DQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rXSw@pqZ&
DataSource ds = (DataSource) ctx.lookup(jndi); #x;d+Q@
Connection cn = ds.getConnection(); f3;[ZS
多用于jsp中 3
JlM{N6+
2、执行sql语句 M3eSj`c3
1)用Statement来执行sql语句 <&+0[9x
String sql; \]FPv7!
Statement sm = cn.createStatement(); p>U= Jg
sm.executeQuery(sql); // 执行数据查询语句(select) *"jlsI
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ga'G)d3oS
2)用PreparedStatement来执行sql语句 #.FhN x
String sql; 2*W|s7cc
sql = "insert into user (id,name) values (?,?)"; c*w0Jz>@.7
PreparedStatement ps = cn.prepareStatement(sql); \0*dKgN
ps.setInt(1,xxx); n1x3q/~
ps.setString(2,xxx); $5#DU__F/
... Ga^:y=m
ResultSet rs = ps.executeQuery(); // 查询 v)vogtAQa
int c = ps.executeUpdate(); // 更新 RP^L.X(7^
Qp@}v7Due
3、处理执行结果 p=[I;U-#H
查询语句,返回记录集ResultSet 8XCT[X
更新语句,返回数字,表示该更新影响的记录数 D7IhNWrgj
ResultSet的方法 PTQN.[bBh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false iYW<qgz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Nbf>Y
Q*f0YjH!
4、释放连接 c?Zi/7
cn.close(); &?j\=%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $|@-u0sv
x=W5e
^0?
可滚动、更新的记录集 !h^_2IX
1、创建可滚动、更新的Statement 6/0bis
H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ihct~y-9W
该Statement取得的ResultSet就是可滚动的 {H=<5
2、创建PreparedStatement时指定参数 a!j{A?7Kw.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); v# fny
ResultSet.absolute(9000); V_4=0(
批量更新 'O
7>w%#
1、Statement uesIkJ^Q[
Statement sm = cn.createStatement(); Q}^qu6
sm.addBatch(sql1); z
wn#E
sm.addBatch(sql2); nx!+:P ,
... gP!k[E,Q8
sm.executeBatch() `Gg,oCQg
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 a3[,3
2、PreparedStatement ;6=*E '
PreparedStatement ps = cn.preparedStatement(sql); k]c$SzJ> /
{ j^/^PUR
ps.setXXX(1,xxx); /i"1e:cK
...
S O`b+B
ps.addBatch(); A*kN
I
} cf\GC2+"^$
ps.executeBatch(); 1,n\Osd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 S:cd'68D
cU "uKR
事务的处理 5hDm[*83
1、关闭Connection的自动提交 [ mo9?
cn.setAutoCommit(false); "Qk)EY
2、执行一系列sql语句 ! ^aJS'aq
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close qjN*oM,
Statement sm ; cOdgBi
sm = cn.createStatement(insert into user...); b~!Q3o'W
sm.executeUpdate(); |4Os_*tRKU
sm.close(); ^aqBL
sm = cn.createStatement("insert into corp...); /9ZU_y4&3f
sm.executeUpdate(); Vo(bro4ZQi
sm.close(); VP }To
3、提交 1Uc/r>u9
cn.commit(); SM.KM_%K
4、如果发生异常,那么回滚 ,UxAHCR~9
cn.rollback();