java 数据库基本操作 V(XU^}b#
1、java数据库操作基本流程 W rT_7
2、几个常用的重要技巧: `4ga~Ch
可滚动、更新的记录集 [6\O
<-?
批量更新 bs}SFT L
事务处理 Rhlm
d~.hp
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 HI1|~hOb'
1、取得数据库连接 /g0' +DP
1)用DriverManager取数据库连接 <bn|ni|c"
例子 7aRy])x
String className,url,uid,pwd; .`*(#9(M9
className = "oracle.jdbc.driver.OracleDriver"; )%9:k9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; H [M:iV
uid = "system"; gdAd7
T
pwd = "manager"; .R)Ho4CE
Class.forName(className); jn]l!nm
Connection cn = DriverManager.getConnection(url,uid,pwd); WCaMPz
2)用jndi(java的命名和目录服务)方式 6wOj,}2Mn
例子 FYNUap,A
String jndi = "jdbc/db"; @Nm{H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); z$Z%us>io
DataSource ds = (DataSource) ctx.lookup(jndi); LvGo$f/9
Connection cn = ds.getConnection(); "tb KbFn9
多用于jsp中 K7$Q.
2、执行sql语句 p]e.E`'S
1)用Statement来执行sql语句 * W"Pv,:
String sql; xhCNiYJ|
Statement sm = cn.createStatement(); qU&v50n
sm.executeQuery(sql); // 执行数据查询语句(select) 3]\'Q}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dXWG`G_
2)用PreparedStatement来执行sql语句 E-X02A
String sql; kQ[23
sql = "insert into user (id,name) values (?,?)"; 6."|m+D
PreparedStatement ps = cn.prepareStatement(sql); R4D$)D
ps.setInt(1,xxx); >7?Lq<H
ps.setString(2,xxx); 0/fwAp
... "<L9-vb
ResultSet rs = ps.executeQuery(); // 查询 gjJ:s,Fg
int c = ps.executeUpdate(); // 更新 W;X:U.
i'ZnU55=
3、处理执行结果 u9 *ic~Nh
查询语句,返回记录集ResultSet 7wrRIeES
更新语句,返回数字,表示该更新影响的记录数 t|&hXh{
ResultSet的方法 rWL&-AZQl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u3 X!O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .^- I<4 .
.lgm"
4、释放连接
*yg`V,C
cn.close(); SbtZhg=S_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %Zeb#//Jz
F(U(b_DPM
可滚动、更新的记录集 8M4GforP
1、创建可滚动、更新的Statement dphWxB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g|]Hm*
该Statement取得的ResultSet就是可滚动的 pB VzmQF
2、创建PreparedStatement时指定参数 %@I= $8j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3D,tnn+J
ResultSet.absolute(9000); Ch=jt*0
批量更新 +nYF9z2
1、Statement 3cH^
,F
Statement sm = cn.createStatement(); 5uM`4xkj
sm.addBatch(sql1); vQ5rhRG)E
sm.addBatch(sql2); 0LWV.OIIC
... PywUPsJ
sm.executeBatch() [7{cf`C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <UW-fI)X
2、PreparedStatement n2opy8J#!
PreparedStatement ps = cn.preparedStatement(sql);
tB0f+ wC
{ SphP@J<ONW
ps.setXXX(1,xxx); <?rdhx
... *Xu?(Jd
ps.addBatch(); =`qEwA
} qz-lQ
ps.executeBatch(); pW<l9W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EP{ji"/7[
q) e*eN
事务的处理 ) Cm95,Y
1、关闭Connection的自动提交 {ZUgyGE{
cn.setAutoCommit(false); =1VpO{q
2、执行一系列sql语句 TaG(sRI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $3Sm?
Statement sm ; @ +>>TGC
sm = cn.createStatement(insert into user...); G Mg|#DV
sm.executeUpdate(); 5N#Sic M
sm.close(); (]"`>,ray
sm = cn.createStatement("insert into corp...); >)F)@KAuN4
sm.executeUpdate(); YQ-V^e6
sm.close(); S2V+%Z
_J
3、提交 *Fd(
cn.commit(); S8e ?-rC
4、如果发生异常,那么回滚 YB9)v5Nz(
cn.rollback();