java 数据库基本操作 ]Gl_L7u`
1、java数据库操作基本流程 Zo-Au
2、几个常用的重要技巧: ;Xidv9c
可滚动、更新的记录集 JmF`5
批量更新 J!rZskd
事务处理 -'W:P'BG
P)TeF1~T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $o\Uq
1、取得数据库连接 ^<yM0'0t
1)用DriverManager取数据库连接 XSZjuQ<[3
例子 :\#]uDT2=
String className,url,uid,pwd; VyU!r*
o
className = "oracle.jdbc.driver.OracleDriver"; IsL=DV/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r~;.8qs
uid = "system"; .hvn/5s
pwd = "manager"; t[%=[pJHW
Class.forName(className); QL(}k)dB
Connection cn = DriverManager.getConnection(url,uid,pwd); `).;W
2)用jndi(java的命名和目录服务)方式 0txSF^x
例子 >fR#U"KPAB
String jndi = "jdbc/db"; b=Sl`&A
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mR{%f?B
DataSource ds = (DataSource) ctx.lookup(jndi); Q[O U`
Connection cn = ds.getConnection(); '9wD+'c=A
多用于jsp中 s|!b: Ms`
2、执行sql语句 >|T?87
1)用Statement来执行sql语句 =7P; /EV
String sql; /=OSGIJzm
Statement sm = cn.createStatement(); MD:kfPQ
sm.executeQuery(sql); // 执行数据查询语句(select) G[yN*C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _Q;M$.[zyR
2)用PreparedStatement来执行sql语句 I(WND/&
String sql; $PbN=@
sql = "insert into user (id,name) values (?,?)"; Y@'1}=`J
PreparedStatement ps = cn.prepareStatement(sql); #iGz&S3iN$
ps.setInt(1,xxx); P3XP=G`E
ps.setString(2,xxx); ( Gxv?\
... j1toV$)P
ResultSet rs = ps.executeQuery(); // 查询 1/qiE{NW
int c = ps.executeUpdate(); // 更新 [laX~(ND{
0H.B>:pv
3、处理执行结果 kqAQrg]n
查询语句,返回记录集ResultSet c9E9Rx
更新语句,返回数字,表示该更新影响的记录数 &9] [~$
ResultSet的方法 .J\U|r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >-y&k^a=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a( {`<F
&<i>)Ss
4、释放连接 U7fE6&g
cn.close(); g?o$:>c
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /[#{#:lo2
;/{Q4X{
可滚动、更新的记录集 I0jEhg%JZ
1、创建可滚动、更新的Statement Iei4yDv ;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); LRd,7P
该Statement取得的ResultSet就是可滚动的 XWy
iS\
2、创建PreparedStatement时指定参数 v:T` D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8UL:C?eY
ResultSet.absolute(9000); B&Ci*#e
批量更新 #WpO9[b>
1、Statement A8eli=W
Statement sm = cn.createStatement(); t@19a6:Co
sm.addBatch(sql1); nt[0krG
sm.addBatch(sql2); " Gn; Q-@
... yZ)ScB^
sm.executeBatch() =yNHJHRA#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #XY]@V\
2、PreparedStatement cwC,VYVl
PreparedStatement ps = cn.preparedStatement(sql); J2[QHr&tn
{ u]MF
r2
ps.setXXX(1,xxx); {:FITF3o
... &Y=NUDt_
ps.addBatch(); K
:q-[\G
} u#UeJuO
ps.executeBatch(); et ~gO!1:*
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ta 6WZu
z=Vvb
事务的处理 w./EJkKI
1、关闭Connection的自动提交 c`}X2u]k
cn.setAutoCommit(false); {4m"S7O
2、执行一系列sql语句 Zz&i0r
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &s;%(c04A
Statement sm ; mVL,J=2
sm = cn.createStatement(insert into user...); A>g$[
sm.executeUpdate(); 9FLn7Y
sm.close(); gX _BJ6
sm = cn.createStatement("insert into corp...); J+|ohA
sm.executeUpdate(); f8^58]wx0
sm.close(); @>:07]Dxo
3、提交 PrKlwhi#
cn.commit(); /#se>4]
4、如果发生异常,那么回滚 /[IQ:':^
cn.rollback();