java 数据库基本操作 z[myf]@
1、java数据库操作基本流程 c!'\k,ma<9
2、几个常用的重要技巧: &I(\:|`o
可滚动、更新的记录集 qxsHhyB_n;
批量更新 BW}M/
事务处理 }p?67y/
|lg jI!iK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <;O^3_'
1、取得数据库连接 (DS"*4ty
1)用DriverManager取数据库连接 SbzJeaZv
例子 o4J@M{xb_
String className,url,uid,pwd; nc\2A>f`
className = "oracle.jdbc.driver.OracleDriver"; 0:<Y@#L
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +."cbqGP_q
uid = "system"; k_ywwkG9lU
pwd = "manager"; :K"~PrHm
Class.forName(className); TA2ETvz^
Connection cn = DriverManager.getConnection(url,uid,pwd); KfYU.Q
2)用jndi(java的命名和目录服务)方式 CV_M |
例子 OK8Ho"
String jndi = "jdbc/db"; cofdDHXfQI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NO@`*:.^Y
DataSource ds = (DataSource) ctx.lookup(jndi); tf|;'Nc6
Connection cn = ds.getConnection(); t|hc`|
多用于jsp中 Zq<j}vVJ
2、执行sql语句 0a^bAEP
1)用Statement来执行sql语句 |WEl5 bNc3
String sql; X!mJUDzh]
Statement sm = cn.createStatement(); u[Si=)`VPk
sm.executeQuery(sql); // 执行数据查询语句(select) `JpFqZ'58
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6vR6=@(`>
2)用PreparedStatement来执行sql语句 }qhYHC
String sql; -aS@y.z
sql = "insert into user (id,name) values (?,?)"; QB!_z4UJ_;
PreparedStatement ps = cn.prepareStatement(sql); 3\
,t_6}
ps.setInt(1,xxx); x[Hx.G}5+
ps.setString(2,xxx); peT91b
... _ DT,iF*6
ResultSet rs = ps.executeQuery(); // 查询 dJ Q K|/
int c = ps.executeUpdate(); // 更新 JbS[(+o
O9/)_:Wdh
3、处理执行结果 .{*l,
查询语句,返回记录集ResultSet M\
更新语句,返回数字,表示该更新影响的记录数 -!\%##r7~
ResultSet的方法 P=KhR&gwV~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x<Gjr}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8ih_S2Cd
D7JrGaF{
4、释放连接 $u'"C|>8
cn.close(); ;UM(y@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection S50}]5K
VltM{-k^
可滚动、更新的记录集 6)ln,{
1、创建可滚动、更新的Statement W=w]`'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); saQs<1
该Statement取得的ResultSet就是可滚动的 Q"nw.FjUG
2、创建PreparedStatement时指定参数 YG8V\4
SQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); I`rN+c:
ResultSet.absolute(9000); \Cj3jg
批量更新 )lJAMZ 5xp
1、Statement c%^B
'
Statement sm = cn.createStatement(); \k`9s
q
sm.addBatch(sql1); unew
XHA
sm.addBatch(sql2); bhIShk[
... g?Nk-cg
sm.executeBatch() #asi%&3pP
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <tZZ]Y]
2、PreparedStatement eOF*|9
PreparedStatement ps = cn.preparedStatement(sql); =b>TF B=*N
{ u)I\R\N
ps.setXXX(1,xxx); PpBptsb^|J
... EPH" 5$8
ps.addBatch(); P5oS 1iu*
} #$-?[c$>
ps.executeBatch(); oYTLC@98}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~%g,Uypi
,d38TN
事务的处理 zIu/!aw
1、关闭Connection的自动提交 *jWh4F,
cn.setAutoCommit(false); f$kbb6juL
2、执行一系列sql语句 G'#u!<(^h
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close fRLA;1va
Statement sm ; =xRD
%Z
sm = cn.createStatement(insert into user...); 3*2~#dh=
sm.executeUpdate(); :r hB=
sm.close(); <I
tS_/z
sm = cn.createStatement("insert into corp...); f_[dFKoX
sm.executeUpdate(); u/6if9B
sm.close(); 9N)I\lcY
3、提交 Qkx*T9W
cn.commit(); yq k8)\p
4、如果发生异常,那么回滚 F0z7".)
cn.rollback();