java 数据库基本操作 %5?qS`/c(
1、java数据库操作基本流程 rvgArFf}]
2、几个常用的重要技巧: 9tDo5
29
可滚动、更新的记录集 s.d }*H-o
批量更新 d~M;@<eD
事务处理 'H+H4(
_WO*N9Iz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 F'^6ra9
1、取得数据库连接 ;7Cb!v1
1)用DriverManager取数据库连接 tgCEz%
例子 se(ZiyHp
String className,url,uid,pwd; P~HzNC
className = "oracle.jdbc.driver.OracleDriver"; j
qfxQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .Zv@iL5
uid = "system"; `dO)}}| y
pwd = "manager"; :Q@=;P2
Class.forName(className); ZCsL%(
Connection cn = DriverManager.getConnection(url,uid,pwd); FH:^<^M
2)用jndi(java的命名和目录服务)方式 UIPi<_Xa
例子 owM3Gz%?UA
String jndi = "jdbc/db"; wl|cipy"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A Ch!D>C1
DataSource ds = (DataSource) ctx.lookup(jndi); -LI^(_
Connection cn = ds.getConnection(); G;#-CT
多用于jsp中 BQmHYar
2、执行sql语句 CV&+^_j'k
1)用Statement来执行sql语句 wQ]!Y?I
String sql; |3j'HN5S
Statement sm = cn.createStatement(); \0?^%CD+@
sm.executeQuery(sql); // 执行数据查询语句(select) 0%$E^`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {>$i)B
2)用PreparedStatement来执行sql语句 o?%1^6&HE
String sql; I-<U u2
sql = "insert into user (id,name) values (?,?)"; d~n|F|`:
PreparedStatement ps = cn.prepareStatement(sql); +0)s{?
ps.setInt(1,xxx); /qM:;:N%j
ps.setString(2,xxx); "5:^aC]
... ElLDSo@WvR
ResultSet rs = ps.executeQuery(); // 查询 #D4gNQg@R
int c = ps.executeUpdate(); // 更新 s~(!m. R
=pSuyM'
3、处理执行结果 Z&BJ/qk
\-
查询语句,返回记录集ResultSet HQqnJ;ns<
更新语句,返回数字,表示该更新影响的记录数 |&!04~s;E
ResultSet的方法 >.'rN>B+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hr9rI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \[u7y. b
<=D!/7$O
4、释放连接 5M6`\LyU
cn.close(); B q/<kEgM
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E$!0h_.(
-CePtq`
可滚动、更新的记录集 ]rk8Jsg
1、创建可滚动、更新的Statement phk fPvL{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #Xdj:T<*
该Statement取得的ResultSet就是可滚动的 @q8h'@sX
2、创建PreparedStatement时指定参数 %#7NCdk;S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :g@H=W
ResultSet.absolute(9000); Qy< ~{6V
批量更新 =Rv!c+?
1、Statement [3KP@'52k
Statement sm = cn.createStatement(); M`m-@z
sm.addBatch(sql1); _p<]jt
sm.addBatch(sql2); b{X,0a{*
... ,e]|[,r#5
sm.executeBatch() &:Mk^DH5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _o,Mji|
2、PreparedStatement }\
^J:@
PreparedStatement ps = cn.preparedStatement(sql); OH+kN/Fd
{ Lt8J^}kwl
ps.setXXX(1,xxx); YC,)t71l{
... Wycood*
ps.addBatch(); Nj~3FL
}
AW[_k%
ps.executeBatch(); J%9)&aW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 yxz)32B?
Wra$
事务的处理 Xu[(hT6
1、关闭Connection的自动提交 qhE1
7Hf
cn.setAutoCommit(false); 816OV
2、执行一系列sql语句 p h5rS<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #Cy9E"lP
Statement sm ; j*XhBWE?
sm = cn.createStatement(insert into user...); aFfd!a"n
sm.executeUpdate(); coG_bX?e
sm.close(); w6cW7}ZD,
sm = cn.createStatement("insert into corp...); 9?xD"Z
sm.executeUpdate(); E$8D^Zt
sm.close(); r:xbs0
7
3、提交 cJ^:b4j
cn.commit(); JJE3\
4、如果发生异常,那么回滚 T ?HG}(2
cn.rollback();