java 数据库基本操作 MuSUKBhM
1、java数据库操作基本流程 e#k<d-sf6
2、几个常用的重要技巧: @/1w4'M
可滚动、更新的记录集 iJ~Vl"|m
批量更新 D:K4H+ch
事务处理 nWHa.H#
=lpQnj"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,`aq+K
1、取得数据库连接 ^,]B@t2
1)用DriverManager取数据库连接 Sr?#S
例子 LlSZr)X
String className,url,uid,pwd; `[n("7,
className = "oracle.jdbc.driver.OracleDriver"; %$DI^yS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =yy5D$\
uid = "system"; 9`9R!=NM
pwd = "manager"; &@3H%DP}Ql
Class.forName(className); |p-t%xDdr
Connection cn = DriverManager.getConnection(url,uid,pwd); |ely|U. Tf
2)用jndi(java的命名和目录服务)方式 vEn4L0D
例子 7>~5jYP
String jndi = "jdbc/db"; of@#:Qs
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); c}0@2Vf
DataSource ds = (DataSource) ctx.lookup(jndi); tzh1s
i
Connection cn = ds.getConnection(); nb>7UN.9
多用于jsp中 ivz{L-
2、执行sql语句 {+@bZ}57
1)用Statement来执行sql语句 9rA=pH%<>B
String sql; 1u9LdkhnY
Statement sm = cn.createStatement(); +U3m#Y )k
sm.executeQuery(sql); // 执行数据查询语句(select) .e3+s*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); S1?-I_t+]
2)用PreparedStatement来执行sql语句 s@7H1)U
String sql; )sT> i
sql = "insert into user (id,name) values (?,?)"; /7YF mI/0
PreparedStatement ps = cn.prepareStatement(sql); YSe.t_K2C
ps.setInt(1,xxx); 9tqF8pb7v
ps.setString(2,xxx); _x5 3g
A
... tq|hPd<C
ResultSet rs = ps.executeQuery(); // 查询 @i*|s~15
int c = ps.executeUpdate(); // 更新 mN19WQ(r
lMbAs.!
3、处理执行结果 Q0ON9gqqv
查询语句,返回记录集ResultSet \0gM o&
更新语句,返回数字,表示该更新影响的记录数 (zFi$
ResultSet的方法 k Zq!&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &EnuE0BD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Pp5^@A
lO_UPC\@fw
4、释放连接 %p0xM
cn.close(); "%x<ttLl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection h?azFA~
C;vtY[}<
可滚动、更新的记录集 Vkc#7W(
1、创建可滚动、更新的Statement bv*,#Qm
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); aVd,xl
该Statement取得的ResultSet就是可滚动的 :]1TGfS
2、创建PreparedStatement时指定参数 ziCHjqT
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,YMp<C
ResultSet.absolute(9000); aT$9;
批量更新 _zwUE
1、Statement 'uxX5k/D@t
Statement sm = cn.createStatement(); )
v,:N.@Q
sm.addBatch(sql1); o+$7'+y1n-
sm.addBatch(sql2); Ht4;5?/y
... 'u1?tQ=gmk
sm.executeBatch() Ez-[
)44/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2]ape !(
2、PreparedStatement G"XVn~]
PreparedStatement ps = cn.preparedStatement(sql); VH1d$
{ =>! Y{:
y(
ps.setXXX(1,xxx); ^!by3Elqqk
... d:U9pC$
ps.addBatch(); Zc`BiLzrIG
} GHeVp/u
ps.executeBatch(); .8G@%p{,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,5*eX
ksN+?E4w
事务的处理 }I2@%tt?
1、关闭Connection的自动提交 WpRc)g:
cn.setAutoCommit(false); PuZf/um
2、执行一系列sql语句 6<ZkJ:=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
MEGv}
Statement sm ; O~^"
sm = cn.createStatement(insert into user...); Os1>kwC
sm.executeUpdate(); n0e1k.A
sm.close(); ]h5Yg/sms
sm = cn.createStatement("insert into corp...); 9& 83n(m
sm.executeUpdate(); GJqJlgHe
sm.close(); \0f{S40
3、提交 s=QAO!aw
cn.commit(); i0$kit
4、如果发生异常,那么回滚 xsMBC
cn.rollback();