java 数据库基本操作 Q+oV?
S3{
1、java数据库操作基本流程 %s! |,Cu
2、几个常用的重要技巧: "<"m}rE?Q
可滚动、更新的记录集 e }Mf
批量更新 r7,}"Pl
事务处理 e\em;GTy
B<Q)z5KK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0NeIQr1N_
1、取得数据库连接 yeI>b 1>Q
1)用DriverManager取数据库连接 >UQY3C
例子 5a-x$Qb9
String className,url,uid,pwd; 4[(NxXH8M
className = "oracle.jdbc.driver.OracleDriver"; 1<tJ3>Xl
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; i! x>)E
uid = "system"; en '""
w
pwd = "manager"; ^Z-oO#)h#
Class.forName(className); uzI=.j
Connection cn = DriverManager.getConnection(url,uid,pwd); ~Pj q3etk
2)用jndi(java的命名和目录服务)方式 (3"N~\9m
例子 %.m+6
zaF
String jndi = "jdbc/db"; 6O<UW.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1<Sg@
DataSource ds = (DataSource) ctx.lookup(jndi); f14^VTzP/#
Connection cn = ds.getConnection(); RA!q)/+
多用于jsp中 Sx[
eX,q
2、执行sql语句 P6&%`$
1)用Statement来执行sql语句 ZfH+Iqd
String sql; ua)jGif
Statement sm = cn.createStatement(); m"T}em#
sm.executeQuery(sql); // 执行数据查询语句(select) ftG3!}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9QaE)wt
2)用PreparedStatement来执行sql语句 41x"Q?.bY
String sql; |r*)U(c`
sql = "insert into user (id,name) values (?,?)"; Wqkzj^;"G
PreparedStatement ps = cn.prepareStatement(sql); d[>HxPwo
ps.setInt(1,xxx); [~u!*W
ps.setString(2,xxx); Zwm/ c]6`
... gW,hI>
ResultSet rs = ps.executeQuery(); // 查询 M.K^W `
int c = ps.executeUpdate(); // 更新 EJ>&\Iq
fZezDm(Q
3、处理执行结果 |{&M#qXe
查询语句,返回记录集ResultSet )S
7+y6f&*
更新语句,返回数字,表示该更新影响的记录数 r\d(*q3B
ResultSet的方法 43pe6 ^.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zs~Tu
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 lH;V9D^
}DXG;L
4、释放连接 =gs-#\%
cn.close(); 'f!U[Qatg
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection NJ)Dw`|%|)
~_-]>
SI
可滚动、更新的记录集 x ZP*%yM
1、创建可滚动、更新的Statement +Q[uq!<VJk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); L;*
s-j6y
该Statement取得的ResultSet就是可滚动的 #R{>@]x`
2、创建PreparedStatement时指定参数 3*&
Y'/!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h~m,0nGO
ResultSet.absolute(9000); .07`nIs"
批量更新 ~N/r;omVc
1、Statement *X(:vET
Statement sm = cn.createStatement(); X%+lgm+
sm.addBatch(sql1); 00.x*v
sm.addBatch(sql2); JwB'B
... .G8>UXX
sm.executeBatch() K
J\kR
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6q\*{_CPB
2、PreparedStatement G.H8
><%
PreparedStatement ps = cn.preparedStatement(sql); {g!7K
{ !uQT4<g
ps.setXXX(1,xxx); ^3TNj
... P+0'^:J
ps.addBatch(); Lxwi"ndP
} |82q|@e
ps.executeBatch(); ly-(F2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 W;'fAohr
E?G'F3i
事务的处理 {YgU23;q
1、关闭Connection的自动提交 iCPm7AU
cn.setAutoCommit(false); bDM },(
2、执行一系列sql语句 MzD1sWmK
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a(|6)w-
Statement sm ; %(1OjfZc
sm = cn.createStatement(insert into user...); ~<?Zj
sm.executeUpdate(); TIKkS*$
sm.close(); I@MG?ZQ
sm = cn.createStatement("insert into corp...); uhh7Ft#H
sm.executeUpdate(); *qwN9b/!
sm.close(); Qz,2PO
3、提交 :YI5O/gsk?
cn.commit(); =3.dgtH
4、如果发生异常,那么回滚 wX0D^)NtF
cn.rollback();