java 数据库基本操作 2lE {
P
1、java数据库操作基本流程 Td
X6<fVV
2、几个常用的重要技巧: 82efqzT
可滚动、更新的记录集 =KMd! $J\
批量更新 "JbFbcj
事务处理 /QD}_lh;,
nU||Jg
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 VOp8 ,!
1、取得数据库连接 %U-KQI0
1)用DriverManager取数据库连接 73 Tg{~
例子 O/iew3YF
String className,url,uid,pwd; Xj?j1R>GB
className = "oracle.jdbc.driver.OracleDriver"; DM~Q+C=Yr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nNq| v=L
uid = "system"; ?)5}v4b
pwd = "manager"; Bn}@wO
Class.forName(className); q yQPR
Connection cn = DriverManager.getConnection(url,uid,pwd); s[8<@I*u
2)用jndi(java的命名和目录服务)方式 /!d,f4n
例子 <),FI <~
String jndi = "jdbc/db"; h&;\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); fb&K.6"
DataSource ds = (DataSource) ctx.lookup(jndi); ~|R"GloUw
Connection cn = ds.getConnection();
o_X"+ s
多用于jsp中 ?Ju=L|
2、执行sql语句 C Vyq/X
1)用Statement来执行sql语句 dD@T}^j *|
String sql; O#CxS/M5
Statement sm = cn.createStatement(); (E\7Ui0Q
sm.executeQuery(sql); // 执行数据查询语句(select) +twJHf_U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); '?wv::t
2)用PreparedStatement来执行sql语句 2gg5:9
String sql; -QI1>7sl
sql = "insert into user (id,name) values (?,?)"; nke[}Hqf
PreparedStatement ps = cn.prepareStatement(sql); }eULcgRG
ps.setInt(1,xxx); !@%m3)T8
ps.setString(2,xxx); e
J2wK3R
... b6R0za
ResultSet rs = ps.executeQuery(); // 查询 .#lQZo6$\|
int c = ps.executeUpdate(); // 更新 \/S?.P#L~
}7wQFKME
3、处理执行结果 c3g\*)Jz"F
查询语句,返回记录集ResultSet X;6&:%ZL@^
更新语句,返回数字,表示该更新影响的记录数 g>T'R Vb
ResultSet的方法 [[LCEw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xH; 4lw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ){L`hQ*=w
v|CRiwx
4、释放连接 J:M^oA'N:>
cn.close(); V)_mo/D!D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *~:4&$
{*yhiE ,
可滚动、更新的记录集 '~<D[](/F
1、创建可滚动、更新的Statement |JnJ=@-y
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6 @'v6 1'
该Statement取得的ResultSet就是可滚动的 QR\qGhQ~
2、创建PreparedStatement时指定参数 =Q[5U9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Go+f0aig
ResultSet.absolute(9000); enDjP
批量更新 | t3_E
1、Statement q71Tg
Statement sm = cn.createStatement(); ;,'eO i
sm.addBatch(sql1); $l 0^2o=
sm.addBatch(sql2); haqL
DVrf
... j""u:l^+x
sm.executeBatch() &AoXv`l4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 . m@Sk`s
2、PreparedStatement !sK{:6s
PreparedStatement ps = cn.preparedStatement(sql); 5lVDYmh
{ A
ElNf:
ps.setXXX(1,xxx); .y#@~H($
... p@YU7_sF^!
ps.addBatch(); ppmDmi~X
} QVQe9{ "0
ps.executeBatch(); Ym2![FC1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3'
mQ=tKa
1g^N7YF
事务的处理 87r#;ND
1、关闭Connection的自动提交 nhiCV>@y
cn.setAutoCommit(false); %dhnp9'
2、执行一系列sql语句 v>;6pcp[F
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n;/yo~RR
Statement sm ; wRi!eN?
sm = cn.createStatement(insert into user...); /2~qm/%Q
sm.executeUpdate(); bTb|@
sm.close(); 8! pfy"
sm = cn.createStatement("insert into corp...); j@&F[ r
sm.executeUpdate(); 9p9:nx\
sm.close(); eM*@}3
3、提交 `G@]\)-!
cn.commit(); bX=A77
4、如果发生异常,那么回滚 mj{TqF
cn.rollback();