java 数据库基本操作 Z*jhSy
1、java数据库操作基本流程 =]U[
2、几个常用的重要技巧: At +on9&=
可滚动、更新的记录集 /xj'Pq((}p
批量更新 %+xh
事务处理 r(%#@?&
L$lo5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ya304Pjd
1、取得数据库连接 x/bO;9E%U4
1)用DriverManager取数据库连接 QBai;p{
例子 [@Uc4LX
String className,url,uid,pwd; aH,0+ |
className = "oracle.jdbc.driver.OracleDriver"; >(:KEA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; z4H!b+
uid = "system"; 89+m?H]K
pwd = "manager"; pr@8PD2%
Class.forName(className); _aa3Qwx
Connection cn = DriverManager.getConnection(url,uid,pwd); q+|Dm<Ug
2)用jndi(java的命名和目录服务)方式 $?wX*
例子 {lx^57v
String jndi = "jdbc/db"; gHYYxhW$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NVJvCs)3f
DataSource ds = (DataSource) ctx.lookup(jndi); c|96;=z~
Connection cn = ds.getConnection(); JF24~Q4P
多用于jsp中 fvN2]@:
2、执行sql语句 7}TjOWC
1)用Statement来执行sql语句 %8hhk]m\b>
String sql; !{r Gt`y
Statement sm = cn.createStatement(); oAv L?2
sm.executeQuery(sql); // 执行数据查询语句(select) \T<?=A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rf^1%Zo:
2)用PreparedStatement来执行sql语句 |/YT.c%
String sql; 7NoB
sql = "insert into user (id,name) values (?,?)"; *hFT,1WE=+
PreparedStatement ps = cn.prepareStatement(sql); QJ>+!p*
ps.setInt(1,xxx); [A[vR7&S
ps.setString(2,xxx); j/dNRleab
... z`f1|Ok
ResultSet rs = ps.executeQuery(); // 查询 >E[cl\5$E
int c = ps.executeUpdate(); // 更新 Q4_j`q
bWjW_$8
3、处理执行结果 Tw-gM-m;
查询语句,返回记录集ResultSet fu\M2"e
更新语句,返回数字,表示该更新影响的记录数 #}e)*(
ResultSet的方法 M^k~w{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false au0)yg*V1
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 OG!^:OY
S : 9zz
4、释放连接 '0/t |V<
cn.close(); :2K0/@<x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sh E>gTe
o D:?fs]
可滚动、更新的记录集
4K)P Yk
1、创建可滚动、更新的Statement >`8i=ZpCOS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0j_`7<,:
该Statement取得的ResultSet就是可滚动的 VT;$:>!+
2、创建PreparedStatement时指定参数 W}a&L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); v7xc01x
ResultSet.absolute(9000); }3=]1jH6
批量更新 <_ddGg~
1、Statement mqw&SxU9
Statement sm = cn.createStatement(); l9#M`x9
sm.addBatch(sql1); |c dQJW
sm.addBatch(sql2); NR^z!+oSR
... DHgEhf]
sm.executeBatch() ([tbFI}A
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j`='SzVloW
2、PreparedStatement (A/V(.!
PreparedStatement ps = cn.preparedStatement(sql); ^hRos
{ MU%C_d%.
ps.setXXX(1,xxx); N1+%[Uh9)
... C!%BW%"R
ps.addBatch(); OAR#* ~q
} ()=
ps.executeBatch(); iK= {pd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g}P.ksM
vfcj,1
事务的处理 Nt'(JAZ;
1、关闭Connection的自动提交 O: :X$O7
cn.setAutoCommit(false); NuLQkf)
2、执行一系列sql语句 AEe*A+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close aXhgzI5]
Statement sm ; 1^b-J0
sm = cn.createStatement(insert into user...); ^e8~eL+
sm.executeUpdate(); +tES:3Pi
sm.close(); W`C2zbC
sm = cn.createStatement("insert into corp...); WENPS*0oS]
sm.executeUpdate(); <Gr{h>b
sm.close();
TB1E1
3、提交 q}U^H
cn.commit(); gle_~es'K
4、如果发生异常,那么回滚 /P Qz$e-!Y
cn.rollback();