java 数据库基本操作 iE"]S )
1、java数据库操作基本流程 ~%=%5}
2、几个常用的重要技巧: U&])ow):
可滚动、更新的记录集 4y3c=L
No
批量更新 o5&b'WUJ=
事务处理 V{oFig 6
,hI$nF0}p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ])F+ C/Px1
1、取得数据库连接 3GE;:;8B
1)用DriverManager取数据库连接 F*J1w|)F0
例子 Yl&[_
l
String className,url,uid,pwd; 1O0. CC,p
className = "oracle.jdbc.driver.OracleDriver"; X:Wd%CHP
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Nkj$6(N=zJ
uid = "system"; H}~K51
pwd = "manager"; bi+M28m
Class.forName(className); #N`G2}1J
Connection cn = DriverManager.getConnection(url,uid,pwd); A+Isk{d
2)用jndi(java的命名和目录服务)方式 :$u[1&6
例子 )-5e Iy
String jndi = "jdbc/db"; s(Gs?6}>T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JW0\y+o~
DataSource ds = (DataSource) ctx.lookup(jndi); h?/E />
Connection cn = ds.getConnection(); "1Hn?4nz5
多用于jsp中 5<*ES[S
2、执行sql语句 :n13v@q
1)用Statement来执行sql语句 #$S~QS.g
String sql; 6T4DuF
Statement sm = cn.createStatement();
\8C<nh
sm.executeQuery(sql); // 执行数据查询语句(select) &Wa3/mWK
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _ s}aF
2)用PreparedStatement来执行sql语句 PQlA(v+S
String sql; &aIFtlC
sql = "insert into user (id,name) values (?,?)"; ;6hoG(3
+
PreparedStatement ps = cn.prepareStatement(sql); BV@q@C
ps.setInt(1,xxx); dh6kj-^;Cf
ps.setString(2,xxx); .yfp-n4H
... "AjC2P],
ResultSet rs = ps.executeQuery(); // 查询 <& PU%^Ha
int c = ps.executeUpdate(); // 更新 `]l`t"x
TC<Rg?&yb
3、处理执行结果 EgPL+qL
查询语句,返回记录集ResultSet hzqgsmT)
更新语句,返回数字,表示该更新影响的记录数 [7PC\
ResultSet的方法 l:@=9Fp>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Y J,"@n_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0/]h"5H3
*FEJ5x
4、释放连接 q)?!]|pZ
cn.close(); q M_c-^F
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1ED7.#g
_y6iR&&x
可滚动、更新的记录集 M .6BFC
1、创建可滚动、更新的Statement .9ZK@xM&?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); HTiLA%%6
该Statement取得的ResultSet就是可滚动的 |) ~-Wy
2、创建PreparedStatement时指定参数 Q{S{|.w-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2jhJXM=~
ResultSet.absolute(9000); b4^O=
批量更新 V /\Y(Mxc
1、Statement 93.\.&L\
Statement sm = cn.createStatement(); <L8FI78[*
sm.addBatch(sql1); `'iO+/;GY
sm.addBatch(sql2); arR<!y7
... u!~kmIa4
sm.executeBatch() PJm@fK(j
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 F|+B8&-v
2、PreparedStatement Ii}{{1N6
PreparedStatement ps = cn.preparedStatement(sql); Q'^'G>MBJ
{ ))dqC l
ps.setXXX(1,xxx); I&i6-xp
... ;TDvk]:
ps.addBatch(); _VgFuU$h
} 8q]"CFpa
ps.executeBatch(); a"Iu!$&N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `2+TN
sF :pwI5^
事务的处理 F> Ika=z,
1、关闭Connection的自动提交 b-VQn5W
cn.setAutoCommit(false); &m36h`tM
2、执行一系列sql语句 D,p2MBr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close fO5L[U^`
Statement sm ; 5ad@}7&
sm = cn.createStatement(insert into user...); l{3zlXk3z
sm.executeUpdate(); G2n.NW#d4
sm.close(); Q:
-&
sm = cn.createStatement("insert into corp...); -@w}}BR
sm.executeUpdate(); d^~yUk
sm.close(); XD6Kp[s
3、提交 .#tA .%
cn.commit(); EGv]K|
4、如果发生异常,那么回滚 T:%0i8p
cn.rollback();