java 数据库基本操作 6m$lK%P{1
1、java数据库操作基本流程 [L ?^+p>
2、几个常用的重要技巧: j[Q9_0R~lR
可滚动、更新的记录集 `~k`m{4.a
批量更新 6Q*Zy[=
事务处理 *YO^+]nmY
sD ,=_q@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -\[H>)z]RB
1、取得数据库连接 Kg6[
1)用DriverManager取数据库连接 e%_J
O7
例子 OaeX:r+&Q
String className,url,uid,pwd; AEd]nVV Q
className = "oracle.jdbc.driver.OracleDriver"; ?RQ_LA;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |5TzRz
uid = "system"; NpLZ
,|H
pwd = "manager"; G nPrwDB
Class.forName(className);
m"/ o4
Connection cn = DriverManager.getConnection(url,uid,pwd); L.?QZN%cN
2)用jndi(java的命名和目录服务)方式 ;V0^uB.z
例子 yQ!I`T>a
String jndi = "jdbc/db"; <q.Q,_cW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); F87/p
DataSource ds = (DataSource) ctx.lookup(jndi); urhOvC$a
Connection cn = ds.getConnection(); A@<a')#>)
多用于jsp中 8}K^o>J&K
2、执行sql语句 CuT50N;tk
1)用Statement来执行sql语句 38#Zlcf
String sql; 8_Nyy/K#F
Statement sm = cn.createStatement(); of=N+
W
sm.executeQuery(sql); // 执行数据查询语句(select) G_]zymXQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); o]M1$)>b+
2)用PreparedStatement来执行sql语句 lc[)O3,,B
String sql; (L<qJd1Q
sql = "insert into user (id,name) values (?,?)"; G
_-JR
PreparedStatement ps = cn.prepareStatement(sql); hN^,'O
ps.setInt(1,xxx); .]w=+~h
ps.setString(2,xxx); K1$
... F}~qTF;H
ResultSet rs = ps.executeQuery(); // 查询 vzFo"
int c = ps.executeUpdate(); // 更新 6UKZ0~R
Jo''yrJpB
3、处理执行结果 Ji4JP0
查询语句,返回记录集ResultSet 8I[=iU7]l
更新语句,返回数字,表示该更新影响的记录数 Ef$a&*)PH
ResultSet的方法 FDal;T
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ggk#>O G
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `0, G'F
=}g-N)^
4、释放连接 mg]t)+ PQ
cn.close(); i_(6}Y&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |=js!R|
H1.ktG
可滚动、更新的记录集 -v! ;
1、创建可滚动、更新的Statement 0bG#'.-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6Ts[NXa
该Statement取得的ResultSet就是可滚动的 }jg1..)"<
2、创建PreparedStatement时指定参数 N*+ L'bO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); OcLahz6
ResultSet.absolute(9000); )G),iy
批量更新 F0kdwN4;
1、Statement k+BY 3a
Statement sm = cn.createStatement(); ]P/i}R:
sm.addBatch(sql1); :s*t\09V7
sm.addBatch(sql2); K7R!E,oPg
... 2m^qXE$
sm.executeBatch() I0*N
"07n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 X-*LA*xbN
2、PreparedStatement fjCFJ_
PreparedStatement ps = cn.preparedStatement(sql); d$^@$E2f
{ *ze,X~8-
ps.setXXX(1,xxx); V|G*9^Y
... 3rBID
ps.addBatch(); q P0UcG
} 22'Ra[
ps.executeBatch(); D-FT3Culw
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 xXlx}C
,FwpHs $A
事务的处理 (8baa.ge
1、关闭Connection的自动提交 EU7nS3K)O~
cn.setAutoCommit(false); RN&6z"|jR
2、执行一系列sql语句 EM(%|#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /dO*t4$ @?
Statement sm ; @/,0()* dL
sm = cn.createStatement(insert into user...); 7g$*K0m`
sm.executeUpdate(); Y-lwS-Ii
sm.close(); x_ t$*
sm = cn.createStatement("insert into corp...); ^WF_IH&
sm.executeUpdate(); aLl=L_
sm.close(); %l,CJd5
3、提交 7K ~)7U
cn.commit(); pk`5RDBu
4、如果发生异常,那么回滚 zm8k,e +5-
cn.rollback();