java 数据库基本操作 pEB3qGA
1、java数据库操作基本流程 g
pciv
2、几个常用的重要技巧: g$(Y\`zw
可滚动、更新的记录集 y"?`MzcJ0
批量更新 (>`_N%_
事务处理 3}L3n*Ft#.
j/V_h'}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @Z]0c=-+
1、取得数据库连接 bR`5g
1)用DriverManager取数据库连接 &BVUK"}P
例子 e\)%<G5
String className,url,uid,pwd; ui]iOp
className = "oracle.jdbc.driver.OracleDriver"; q NGR6i
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 4S(G366
uid = "system"; T!
}G51
pwd = "manager"; /N0mF< P
Class.forName(className); +o+f\!
Connection cn = DriverManager.getConnection(url,uid,pwd); A;!5c;ftj,
2)用jndi(java的命名和目录服务)方式 [bLKjD
例子 vbJ<|#|r-
String jndi = "jdbc/db"; mQj# \<*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4vg,g(qi<
DataSource ds = (DataSource) ctx.lookup(jndi); O"9t,B>=i
Connection cn = ds.getConnection(); zJ`u>:*$
多用于jsp中 ,7nu;fOT[
2、执行sql语句 97c0bgI!+
1)用Statement来执行sql语句 =B&|\2`{)
String sql; (o>N*?,}
Statement sm = cn.createStatement(); ft"-
sm.executeQuery(sql); // 执行数据查询语句(select) @Y~gdK
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Y XhZWo{B
2)用PreparedStatement来执行sql语句 y)r`<B
String sql; o*T?f)_[p
sql = "insert into user (id,name) values (?,?)"; .M6. ]H
PreparedStatement ps = cn.prepareStatement(sql); GTs,?t16/
ps.setInt(1,xxx); I!zoo[/)%
ps.setString(2,xxx); x1=`Z@^
... ;LS.
ResultSet rs = ps.executeQuery(); // 查询 -6MPls+
int c = ps.executeUpdate(); // 更新 .]9`eGVWj
cGE{dWz
3、处理执行结果 s:<y\1Ay
查询语句,返回记录集ResultSet
u7!gF&tA
更新语句,返回数字,表示该更新影响的记录数 2_$8Ga
ResultSet的方法 >A )Sl'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .)*&NY!nsl
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $`xpn#lz
c{'Z.mut
4、释放连接 \t{iyUxY
cn.close(); Jq1oQu|rs
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6@aH2+4+
CI+)0=`<1B
可滚动、更新的记录集 /G5KNSi
1、创建可滚动、更新的Statement 8] LF{Obz[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~'*23]j
该Statement取得的ResultSet就是可滚动的 5?3 v;B6
2、创建PreparedStatement时指定参数 E2Sj IR}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [w](x
ResultSet.absolute(9000); CfOyHhhKX
批量更新 X8}r= K~
1、Statement l(Y32]Z
Statement sm = cn.createStatement(); c |%5SA
sm.addBatch(sql1); 2tU3p<[
sm.addBatch(sql2); S5|7D[*
... ImQ-kz?b
sm.executeBatch() 4#t'1tzu#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &"u(0q
2、PreparedStatement |A4B4/!
PreparedStatement ps = cn.preparedStatement(sql); t{,$?}
{ 2NFk#_9e~
ps.setXXX(1,xxx); !fs ~ >
... %g*nd#wG
ps.addBatch(); K-YxZAf
} *wAX&+);
ps.executeBatch(); E[hSL#0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /A5=L<T6F
}51QUFhL0
事务的处理 ^uo,LTq+
1、关闭Connection的自动提交 padV|hF3(e
cn.setAutoCommit(false); YBY;$&9
2、执行一系列sql语句 6cg,L:j#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9u~C?w
Statement sm ; 6l|L/Z_6
sm = cn.createStatement(insert into user...); zt2#K
sm.executeUpdate(); )^UqB0C6^
sm.close(); dLQp"vs $
sm = cn.createStatement("insert into corp...); A?tCa*b^
sm.executeUpdate(); 6rS
? FG=
sm.close(); 0MT?}D&TL
3、提交 ,%Pn.E* r;
cn.commit(); *7*_QW%?A
4、如果发生异常,那么回滚 TaF*ZT2
cn.rollback();