java 数据库基本操作 fDT%!
1、java数据库操作基本流程 tKuVQH~D
2、几个常用的重要技巧: :pGaFWkvO
可滚动、更新的记录集 Ove<mFI\
批量更新 l|/ep:x8
事务处理 P!H_1RwXKC
.@(6 Y<dN
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y"~gw~7OD
1、取得数据库连接 ^lA=* jY(
1)用DriverManager取数据库连接 [P&7i57
例子 E~]R2!9
String className,url,uid,pwd; 9fhsIe
className = "oracle.jdbc.driver.OracleDriver"; ;\]b T;#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
f4Xk,1Is
uid = "system"; ?AJKBW^
pwd = "manager"; @)|C/oA
Class.forName(className); EB2w0a5
Connection cn = DriverManager.getConnection(url,uid,pwd); 4)@mSSfn.
2)用jndi(java的命名和目录服务)方式 WU
quN
例子 .#rJ+.2
String jndi = "jdbc/db"; `(YxI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); umiBj)r
DataSource ds = (DataSource) ctx.lookup(jndi); E%rk[wI
Connection cn = ds.getConnection(); 'eLqlu|T
多用于jsp中 M_"L9^^>N
2、执行sql语句 q1QL@Ax
1)用Statement来执行sql语句 \P.I)n`8 y
String sql; l038%U~U!
Statement sm = cn.createStatement(); h| ,:e;>}
sm.executeQuery(sql); // 执行数据查询语句(select) 6LalW5I
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); BI3@|,._N
2)用PreparedStatement来执行sql语句 Lv|q
String sql; N"]q='t
sql = "insert into user (id,name) values (?,?)"; {so`/EWa
PreparedStatement ps = cn.prepareStatement(sql); [H6hyG~
ps.setInt(1,xxx); a0D%k: k5
ps.setString(2,xxx); D|e
uX7b
... l|kSsP:GO
ResultSet rs = ps.executeQuery(); // 查询 FFu9&8Y
int c = ps.executeUpdate(); // 更新 ,.kha8v
CIb2J)qev
3、处理执行结果 ti
I.W
查询语句,返回记录集ResultSet >8k_n
更新语句,返回数字,表示该更新影响的记录数 GBRa.;Kk
ResultSet的方法 /atW8 `&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Q36qIq_0e
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V:VO[e<e
f33 l$pOp
4、释放连接 {]%0lf:
cn.close(); KY51rw.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cc~O&?)i
ioYGZ%RG#
可滚动、更新的记录集 `< xn8h9p
1、创建可滚动、更新的Statement mt,OniU= Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hRUhX[
该Statement取得的ResultSet就是可滚动的 45,1-? -!
2、创建PreparedStatement时指定参数 mF,Y?ax
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); K`u(/kz/<
ResultSet.absolute(9000); `HZ;NRr
批量更新 |}(`kW
1、Statement FaDjLo2'o
Statement sm = cn.createStatement(); |wH5sjT
sm.addBatch(sql1); ,*7 (%k^`
sm.addBatch(sql2); :lf+W
... (Iaf?J5{
sm.executeBatch() `$W_R[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $ZugBh[b
2、PreparedStatement Cjc6d4~
PreparedStatement ps = cn.preparedStatement(sql); va}Pj#=
{ r76J
N
ps.setXXX(1,xxx); @ycDCB(D}
... ??M"6k
ps.addBatch(); j4|N-:
} 8 ~J(](QA
ps.executeBatch(); 0yuS3VY)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {^\+iK4bS
qI#;j%V
事务的处理 ABD)}n=%c
1、关闭Connection的自动提交 e?JW
cn.setAutoCommit(false);
1~Oe=`{&
2、执行一系列sql语句 `w.n]TR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _"bHe/'CI
Statement sm ; JM x>][xD
sm = cn.createStatement(insert into user...); mID"^NOi#
sm.executeUpdate(); 3?V_BUoON
sm.close(); H!5\v"]WB
sm = cn.createStatement("insert into corp...); nxWY7hU
sm.executeUpdate(); ]:Nsf|C0
sm.close(); E\as@pqo\p
3、提交 mOy^vMa
cn.commit(); ^c^#dpn
4、如果发生异常,那么回滚 +a^nlW9g
cn.rollback();