java 数据库基本操作 @%R4V[Lo.
1、java数据库操作基本流程 kFWwz^x
2、几个常用的重要技巧: ]`|$nU}v
可滚动、更新的记录集 8YQuq.(>a
批量更新 QMsq4yJ)%
事务处理 fUkqhqe
0X5cn 0L^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <.QaOLD
1、取得数据库连接 7;fC%Fq
1)用DriverManager取数据库连接 eZa*WI=
例子 {fzX2qMZ]
String className,url,uid,pwd; w}>%E6UY
className = "oracle.jdbc.driver.OracleDriver"; j)mU`b_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; A~bSB
n: '
uid = "system"; _|#abLh%
pwd = "manager"; B2ln8NF#Q
Class.forName(className); )}`z<)3jP
Connection cn = DriverManager.getConnection(url,uid,pwd); 6iyl8uL0J
2)用jndi(java的命名和目录服务)方式 #dWz,e3
例子 Lj<TzPzg*
String jndi = "jdbc/db"; sv%X8
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); N| DI
k
DataSource ds = (DataSource) ctx.lookup(jndi); qY#*LqV
Connection cn = ds.getConnection(); UhDQl%&He
多用于jsp中 FBNLszT{L
2、执行sql语句 9{jMO
1)用Statement来执行sql语句 +Y sGH~jX
String sql; #&}-
q
RA
Statement sm = cn.createStatement(); CUI3^;&S
sm.executeQuery(sql); // 执行数据查询语句(select) m4hkV>$d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @kFZN 6
2)用PreparedStatement来执行sql语句 [Y
.8C$0
String sql; K$,Zg
sql = "insert into user (id,name) values (?,?)"; 5wx_ol}2
PreparedStatement ps = cn.prepareStatement(sql); JY#vq'dl|
ps.setInt(1,xxx); X3:z=X&Zd
ps.setString(2,xxx); _-_iw&F
... $*#^C;7O
ResultSet rs = ps.executeQuery(); // 查询 ;{sZDjev>
int c = ps.executeUpdate(); // 更新 d&FXndC4F
BV~J*e
3、处理执行结果 &)1.z7T
查询语句,返回记录集ResultSet STW?0B'Jr
更新语句,返回数字,表示该更新影响的记录数 )[Tm[o?Y.
ResultSet的方法 D$}8GYq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2X@9o4_4q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |IcW7(
?}cmES kX@
4、释放连接 "[_j8,t`
cn.close(); .`OU\LA
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection */;7Uv7
,TQec:B
可滚动、更新的记录集 XjG S.&'I
1、创建可滚动、更新的Statement >&PM'k
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jq,M1
该Statement取得的ResultSet就是可滚动的 VhUWws3E
2、创建PreparedStatement时指定参数 m^3x%ENZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \)~d,M}kK
ResultSet.absolute(9000); !/XNp QP
批量更新 !<p,G`r
1、Statement u5oM;#{@-
Statement sm = cn.createStatement(); d?*]/ZiR
sm.addBatch(sql1); PEf yHf7`
sm.addBatch(sql2); }HoCfiE=X
... Fc5.?X-
sm.executeBatch() X,k^p[Rcu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $gUlM+sK
2、PreparedStatement |H?t+Dyn)q
PreparedStatement ps = cn.preparedStatement(sql); ^jMrM.GY
{ + `|A/w
ps.setXXX(1,xxx); s:3[#&PQpN
... .Fo#Dmq3
ps.addBatch(); "JB4Uaa
} )UKX\nD"0
ps.executeBatch(); y8k8Hd1<f
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7}X1A!1
DhyR
事务的处理 Z3S+")^
1、关闭Connection的自动提交 >O-KJZ'GV
cn.setAutoCommit(false); 'C'mgEl%L
2、执行一系列sql语句 zXY8:+f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ZyGoOk
Statement sm ; PILpWhjL$9
sm = cn.createStatement(insert into user...); T8o](:B~
sm.executeUpdate(); m)Plv+R}
sm.close(); JQ03om--(
sm = cn.createStatement("insert into corp...); :wC\IwG~CE
sm.executeUpdate(); DSU8jnrL
sm.close(); PK[mf\G\
3、提交 2RkW/)A9
cn.commit(); B0@
Tz39=
4、如果发生异常,那么回滚 f{P1.?a
cn.rollback();