java 数据库基本操作 C^O
VB-
1、java数据库操作基本流程 Zq^At+8+
2、几个常用的重要技巧: +[M6X}
TQ
可滚动、更新的记录集 [A~y%bI"
批量更新 i`(XLi}k
事务处理 h?AS{`.1
DVG(Vw
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {&cJDqz5=
1、取得数据库连接 ^NRl//
1)用DriverManager取数据库连接 &q3"g*q
例子 FEW14U'O
String className,url,uid,pwd; '9laa=H%8
className = "oracle.jdbc.driver.OracleDriver"; fa-IhB1!K
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N@2dA*T,
uid = "system"; \z>fb%YW
pwd = "manager"; ohRjvJ'v|
Class.forName(className); <NR#Y%}-V
Connection cn = DriverManager.getConnection(url,uid,pwd); bn#"?6Z2
2)用jndi(java的命名和目录服务)方式 Bn^0^J-
例子 b+%f+zz*h
String jndi = "jdbc/db"; 3_ r*y9l
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Hkk/xNP
DataSource ds = (DataSource) ctx.lookup(jndi); CnU*Jb
Connection cn = ds.getConnection(); uW=k K0E
多用于jsp中 o
m^0}$V
2、执行sql语句 ]3x?
1)用Statement来执行sql语句 \9cbI3rGz
String sql; ERUz3mjA/
Statement sm = cn.createStatement(); ]_Vx{oT7
sm.executeQuery(sql); // 执行数据查询语句(select) hW%TM3l}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,`|3KE9
2)用PreparedStatement来执行sql语句 y<?kzt
String sql; 0g
+7uGp:
sql = "insert into user (id,name) values (?,?)"; l}a)ZeR1
PreparedStatement ps = cn.prepareStatement(sql); AS!?q
ps.setInt(1,xxx); n4s+>|\M
ps.setString(2,xxx); ./-5R|fN
... Q!o'}nA
ResultSet rs = ps.executeQuery(); // 查询 -C;^3R[
O
int c = ps.executeUpdate(); // 更新 m!gz3u]rN
?h3Y)5x T
3、处理执行结果 9{'N{
查询语句,返回记录集ResultSet ?~l6K(*2
更新语句,返回数字,表示该更新影响的记录数 a+[RS]le
ResultSet的方法 HU1h8E$-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Tre]"2l
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;%B(_c
!F*5M1Kjd
4、释放连接 c'^?/$H|
cn.close(); wu7Lk3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Umz KY
<5-[{Q/2z
可滚动、更新的记录集 %<)2/|lCd
1、创建可滚动、更新的Statement <C_jF
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w;;BSJ]+[
该Statement取得的ResultSet就是可滚动的 |EIng0a
2、创建PreparedStatement时指定参数 9/{(%XwX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~,d,#)VE2q
ResultSet.absolute(9000); FTH|9OP
批量更新 .S!mf
1、Statement pf2[,v/
Statement sm = cn.createStatement(); b[sx_b
sm.addBatch(sql1); XtXEB<4Z
sm.addBatch(sql2); qaqBOHI6G
... ]S&&|Fc
sm.executeBatch() 'OE&/
C[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ."TxX.&HE
2、PreparedStatement J &o|QG
PreparedStatement ps = cn.preparedStatement(sql); h2)yq:87
{ e
h&IPU S
ps.setXXX(1,xxx); !SC`D])l
... bo,_&4?
ps.addBatch(); 7P%%p3
} G|[ =/>~B
ps.executeBatch(); .\\DKh%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 S$f9m
aKV$pC<[o
事务的处理 ; PF`Wj
1、关闭Connection的自动提交 ,QOG!T4
cn.setAutoCommit(false); +cD<:"L'g
2、执行一系列sql语句 Qn^'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :<ka3<0%
Statement sm ; dah[:rP,n{
sm = cn.createStatement(insert into user...); mH54ja2
sm.executeUpdate(); 5 z~1Dw
sm.close(); s6ZuM/Q
sm = cn.createStatement("insert into corp...); jG6]A"pr
sm.executeUpdate(); pe0F0Ruy
sm.close(); a:+{f&
3、提交 &qLf@1AD
cn.commit(); 3T31kQv{
4、如果发生异常,那么回滚 xqXo0
cn.rollback();