java 数据库基本操作 \@eaSa
1、java数据库操作基本流程 ]Jum(1Bo
2、几个常用的重要技巧: >"/Sa_w
可滚动、更新的记录集 C25EIIdRb
批量更新 vMHJgpd&j
事务处理 sI OT6L^7
{;2Gl $\r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D=^|6}
1、取得数据库连接 7jzd
I!
1)用DriverManager取数据库连接 P2t9RCH
例子 )J>-;EYb8
String className,url,uid,pwd; "BvAiT{u
className = "oracle.jdbc.driver.OracleDriver"; 2zlBrjk;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N,0&xg3
uid = "system"; ,| Zkpn8
pwd = "manager"; "0sk(kT
Class.forName(className); !zR1CM
Connection cn = DriverManager.getConnection(url,uid,pwd); 1:j[p=Q&
2)用jndi(java的命名和目录服务)方式 VX+:C(m~
例子 nvOJY6)$V
String jndi = "jdbc/db"; sVNM#,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); I$Ra*r
DataSource ds = (DataSource) ctx.lookup(jndi); ?H0"*8C?Y
Connection cn = ds.getConnection(); 5bHS| <
多用于jsp中 gY/p\kwsj
2、执行sql语句 tYzpL
1)用Statement来执行sql语句 2l.qINyz
String sql; IPa)+ ZQ
Statement sm = cn.createStatement(); qHf8z;lc
sm.executeQuery(sql); // 执行数据查询语句(select) y7@q]~%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |qq7vx
2)用PreparedStatement来执行sql语句 y yqya[-11
String sql; ^)%TQ.
sql = "insert into user (id,name) values (?,?)"; g?1! /+
PreparedStatement ps = cn.prepareStatement(sql); c>)_ I
ps.setInt(1,xxx); _!:*&{
ps.setString(2,xxx); .ZVADVg\
... SMMvRF`7
ResultSet rs = ps.executeQuery(); // 查询 i!7|YAu
int c = ps.executeUpdate(); // 更新 lG/h[
d>-k-X-[
3、处理执行结果 KwxO%/-}S
查询语句,返回记录集ResultSet AD0pmD
更新语句,返回数字,表示该更新影响的记录数 (d?sFwOt\
ResultSet的方法 |<Rf^"T
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]dU/;8/%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zv>7;En3
T8US` MZ
4、释放连接 V
3yt{3Or
cn.close(); FI=]K8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (;T g1$
EpdSsfDP
可滚动、更新的记录集 }\oy%]_mY
1、创建可滚动、更新的Statement 3OvQ,^[J4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2(s-8E:
该Statement取得的ResultSet就是可滚动的 t`
f.HJe
2、创建PreparedStatement时指定参数 }Q#3\z5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -8pQI
ResultSet.absolute(9000); 6U?z
批量更新 grbUR)f<?-
1、Statement ?_BK(kL_
Statement sm = cn.createStatement(); ]`H8r y2
sm.addBatch(sql1); [7sy}UH
sm.addBatch(sql2); V^D!\)#
... P; DGs]PF
sm.executeBatch() SMIr@*R
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u0?,CQPL
2、PreparedStatement t(Sjo8,
b
PreparedStatement ps = cn.preparedStatement(sql); :J~sz)n4
{ D)){"Q!b
ps.setXXX(1,xxx); D\9-MXc1
... E5`KUMZkq
ps.addBatch(); pe@j`Sm:Ej
} 9LK<u $C
ps.executeBatch(); ["}Yp
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 k]] e8>
j" ~gEGfK
事务的处理 Izr_]%
1、关闭Connection的自动提交 wzNGL{3
cn.setAutoCommit(false); IWs)n1D*]
2、执行一系列sql语句 o3kVcX^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close e>~7RN
Statement sm ; Puodsd
sm = cn.createStatement(insert into user...); @p$$BUb
sm.executeUpdate(); v#`7,::
sm.close(); nAY'1!O i
sm = cn.createStatement("insert into corp...); l
4e`-7
sm.executeUpdate(); rJws#^]
sm.close(); z]33_[G1U
3、提交 1_V',0|`>
cn.commit(); JV_V2L1Ut
4、如果发生异常,那么回滚 nhb: y
cn.rollback();