java 数据库基本操作 86,$ I+
1、java数据库操作基本流程 wk"zpI7L
2、几个常用的重要技巧: ]/{987
可滚动、更新的记录集 `Gp!Y
批量更新 P?P))UB5
事务处理 fCxF3m(O
*PVv=SU
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 az2CFd^M
1、取得数据库连接 8fwM)DKS
1)用DriverManager取数据库连接 .xp|w^
例子 Ew kZzVuX
String className,url,uid,pwd; t846:Z%[
className = "oracle.jdbc.driver.OracleDriver"; W=k%aB?p
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ly$s0.!
uid = "system"; z.7'yJIP#
pwd = "manager"; NJglONO
Class.forName(className); h8MkfHH7{
Connection cn = DriverManager.getConnection(url,uid,pwd); sB,>4*Zd
2)用jndi(java的命名和目录服务)方式 [o,S.!W8
例子 X519}
l3
String jndi = "jdbc/db"; Qb;5:U/x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); g6. =(je
DataSource ds = (DataSource) ctx.lookup(jndi); 32sb$|eQq
Connection cn = ds.getConnection(); KVrK:W--p
多用于jsp中 s *B-|
2、执行sql语句 Kc:}
K y
1)用Statement来执行sql语句 dn1Tu6f;|
String sql; pH1 9"=p<
Statement sm = cn.createStatement(); 20t</lq.
sm.executeQuery(sql); // 执行数据查询语句(select) /:}z*a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ohA@Zm8O
2)用PreparedStatement来执行sql语句 #`0iN+qh
String sql;
Dy[
YL
sql = "insert into user (id,name) values (?,?)"; /B?hM&@z
PreparedStatement ps = cn.prepareStatement(sql); >5jHgs#
ps.setInt(1,xxx); [}OL@num
ps.setString(2,xxx); *ppb4R;CW
... ;#$zHR
ResultSet rs = ps.executeQuery(); // 查询 DgLSDKO!
int c = ps.executeUpdate(); // 更新 > HL8hN'q'
=/Dp*
3、处理执行结果 !I? J^0T
查询语句,返回记录集ResultSet FDAREE\j
更新语句,返回数字,表示该更新影响的记录数 D=fB&7%@
ResultSet的方法 dIo|i,-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false nAp7X-t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4D/mm(2d$
>)N}V'9
4、释放连接 Mlpq2I_x
cn.close(); _5nQe
!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Wsr #YNhx|
"Jp6EL%
可滚动、更新的记录集 pP'-}%
1、创建可滚动、更新的Statement z^f-MgWG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CDcs~PR@B
该Statement取得的ResultSet就是可滚动的 YJ5;a\QxN
2、创建PreparedStatement时指定参数 ~%Ws"1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); uxto:6),P<
ResultSet.absolute(9000); >Q~"/-bN)
批量更新 L?^C\g6u]
1、Statement +M\*C#
Statement sm = cn.createStatement(); ] 05Q4
sm.addBatch(sql1); BX),U
sm.addBatch(sql2); tc{23Rf%
... Mdh(Mp(w
sm.executeBatch() _OF8D
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (WW,]#^
2、PreparedStatement "gCSbMq(Vq
PreparedStatement ps = cn.preparedStatement(sql); S)"5X)mq
{ |7zm!^t$
ps.setXXX(1,xxx); Oh:SH|=]#
... F|V co]"S1
ps.addBatch(); OD"eB?
} 55oLj.l^j
ps.executeBatch();
KG#|Cq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qi7wr\XNW
O'."ca]:5
事务的处理 ?.A6HrAPB
1、关闭Connection的自动提交 Q9[dUdQm
cn.setAutoCommit(false); utwh"E&W
2、执行一系列sql语句 ^;YD3EZw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i[ BR"(
Statement sm ; P|.KMtG
sm = cn.createStatement(insert into user...); ?<w +{
sm.executeUpdate(); "VWxHRVg4M
sm.close(); r/Pg,si
sm = cn.createStatement("insert into corp...); +V|]:{3W
sm.executeUpdate(); 7$GP#V1r/
sm.close(); @fpxGMy&
3、提交 CRWO R pP
cn.commit(); )m[!HE`cZ
4、如果发生异常,那么回滚 1&YP}sg)
cn.rollback();