java 数据库基本操作 YLO/J2['
1、java数据库操作基本流程 \'AS@L"Wj^
2、几个常用的重要技巧: ,*}5xpX
可滚动、更新的记录集 ))z1T 8
批量更新 {6uh Ub
事务处理 -'jPue2\
;?`l1:C5)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q*h%'oc`
1、取得数据库连接 Er]lObfQo
1)用DriverManager取数据库连接 }G50?"^u
例子 -jJw wOm
String className,url,uid,pwd; ^3:y<{J
className = "oracle.jdbc.driver.OracleDriver"; Pa}B0XBWP
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; x22:@Ot6
uid = "system"; }[%d=NY
pwd = "manager"; tEE1`10Mt
Class.forName(className); 83ajok4E
Connection cn = DriverManager.getConnection(url,uid,pwd); lx vRF93a.
2)用jndi(java的命名和目录服务)方式 _a e&@s1
例子 6QC=:_M;
String jndi = "jdbc/db"; `T \"B%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :1O1I2L0
DataSource ds = (DataSource) ctx.lookup(jndi); w`?Rd
Connection cn = ds.getConnection(); W18I"lHeh
多用于jsp中 D" 4*&
2、执行sql语句 E*F)jP,yo
1)用Statement来执行sql语句 cx(W{O"Jb
String sql; 8%;K#,>
Statement sm = cn.createStatement(); $)fybnY
sm.executeQuery(sql); // 执行数据查询语句(select) k;?Oi?]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /KWR08ftp
2)用PreparedStatement来执行sql语句 v-J9N(y"
String sql; b35Z1sfD
j
sql = "insert into user (id,name) values (?,?)"; /W,K% s]
PreparedStatement ps = cn.prepareStatement(sql); H%*<t}
ps.setInt(1,xxx); fzVU9BU
ps.setString(2,xxx); vFL\O
... NQD*8PGfj
ResultSet rs = ps.executeQuery(); // 查询 jr9/
int c = ps.executeUpdate(); // 更新 vGT#BS%
3N]
3、处理执行结果 4&+;n[ D
查询语句,返回记录集ResultSet 3/w) mY-o
更新语句,返回数字,表示该更新影响的记录数 nnZ|oEF
ResultSet的方法 1M4I7*r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
<$\En[u0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 c<8RRYs
$:bU<
4、释放连接 Nm0kMq|h
cn.close(); t1I` n(]n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "F*'UfOwrZ
KvM}g2"
可滚动、更新的记录集 (v\Cv)OS
1、创建可滚动、更新的Statement f8DF>]WW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -cjwa-9
~
该Statement取得的ResultSet就是可滚动的 |^ao,3h#
2、创建PreparedStatement时指定参数 r#K;@wu2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Nz,8NM]
ResultSet.absolute(9000); 9\|n2$H:
批量更新 S'I{'jP5
1、Statement SX{6L(
Statement sm = cn.createStatement(); H nRd
sm.addBatch(sql1); }a(x
L'F
sm.addBatch(sql2); ;plzJ6>
... 0$n0fu
sm.executeBatch() %EZG2J jO)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0nF>E@ j^[
2、PreparedStatement OOEmXb]8
PreparedStatement ps = cn.preparedStatement(sql); EcA@bZ0
{ rf% E+bh4
ps.setXXX(1,xxx); Lmy ^/P%
... g2=5IU<
ps.addBatch(); tNskB`541
} E47U &xL
ps.executeBatch(); r$~w3yN)v
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m,e@bJ-
QES[/i +
事务的处理 V}l>p?
1、关闭Connection的自动提交 DR`d^aBWQ
cn.setAutoCommit(false); wn'_;0fg
2、执行一系列sql语句 "RG.27
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a*}ZT,V
Statement sm ; v'C`;I
sm = cn.createStatement(insert into user...); OBF2?[V~
sm.executeUpdate(); silTL_$
sm.close(); H1PW/AW
sm = cn.createStatement("insert into corp...); .)W'{2J-
sm.executeUpdate(); -f.<s!a
sm.close(); Xj;nh?\u
3、提交 .[1"Med J
cn.commit(); <;d?E%`
4、如果发生异常,那么回滚 C:n55BE9
cn.rollback();