java 数据库基本操作 .+1I>L
1、java数据库操作基本流程 JhFn"(O
2、几个常用的重要技巧: SQ,-45@W
可滚动、更新的记录集 -kk7y
批量更新 G~1;_'
事务处理 !-OZ/^l|O`
lq:q0>vyI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 jM$bWtq2
1、取得数据库连接 qt@/
1)用DriverManager取数据库连接 +4%~.,<_to
例子 L-w3A:jk
String className,url,uid,pwd; !s-A`}
s+
className = "oracle.jdbc.driver.OracleDriver"; tG$O[f@U6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [gBf1,bK
uid = "system"; ;F258/J
pwd = "manager"; u*@R`,Y
Class.forName(className); ! :]_-DX
Connection cn = DriverManager.getConnection(url,uid,pwd); ht2Fie
2)用jndi(java的命名和目录服务)方式 Cw(e7K7&
例子 72Bc0Wg
String jndi = "jdbc/db"; et+lL"&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); B9NUafK=
DataSource ds = (DataSource) ctx.lookup(jndi); X6
BIZ
Connection cn = ds.getConnection(); sR9$=91`
多用于jsp中
!tTv$L>
2、执行sql语句 ,CyX*k8o
1)用Statement来执行sql语句 &'/"=lK
String sql; }9\_s*
Statement sm = cn.createStatement(); h7+"*fN
sm.executeQuery(sql); // 执行数据查询语句(select) m
.(ja
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dnLjcHFj&
2)用PreparedStatement来执行sql语句 90}vFoy
String sql; }oZ8esZU2
sql = "insert into user (id,name) values (?,?)"; AF#:*<Ev
PreparedStatement ps = cn.prepareStatement(sql); ysOf=~1
ps.setInt(1,xxx); [nxYfER7
ps.setString(2,xxx); 4N,[Gs<7
... *Vl#]81~
ResultSet rs = ps.executeQuery(); // 查询 KhWy
int c = ps.executeUpdate(); // 更新 1TTS@\
+1T>Ob;hk
3、处理执行结果 G K~A,Miqk
查询语句,返回记录集ResultSet LKvX~68
更新语句,返回数字,表示该更新影响的记录数 @LI;q
ResultSet的方法 6c]4(%8
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @;eH~3P
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6 EqN>.
G06;x
4、释放连接 F\N0<o
cn.close(); [UXVL}tk
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2B$dT=G
}SWfP5D@
可滚动、更新的记录集 Sk53Lc
1、创建可滚动、更新的Statement bQ>wyA+G&E
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); TQO|C?
该Statement取得的ResultSet就是可滚动的 G@DNV3Cc
2、创建PreparedStatement时指定参数 Mrk3r/
8w
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [l^XqD D4
ResultSet.absolute(9000);
{ 8 K
批量更新 4|_xz;i
1、Statement :? B4q#]N
Statement sm = cn.createStatement(); *N$XQ{o
sm.addBatch(sql1); CCG5:xS
sm.addBatch(sql2); fh`Y2s|:7R
... 6k0Awcr
sm.executeBatch() nX:E(9q7c
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9!=4}:+
2、PreparedStatement ,5zY1C==Ut
PreparedStatement ps = cn.preparedStatement(sql); 6kp)'wz`
{ A~Sc ] M
ps.setXXX(1,xxx); +>C26Q
... Y[L,rc/j
ps.addBatch(); sP^:*B0
} \9,lMK[b
ps.executeBatch(); OulRqbL2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?M'CTz}<\
|[n\'Xy;{
事务的处理 wm#(\dj
1、关闭Connection的自动提交
6xx.Z3v
cn.setAutoCommit(false); 7Z2D}O+
2、执行一系列sql语句 w
aniCEo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close EC$F|T0f
Statement sm ; {Yxvb**
sm = cn.createStatement(insert into user...); QswPga(-
sm.executeUpdate(); je$H}D
sm.close(); b&!}SZ
sm = cn.createStatement("insert into corp...); e-`9-U%6
sm.executeUpdate(); XwEMF5[
sm.close(); hub]M
3、提交 @XG1d)sE
cn.commit(); iyCH)MA
4、如果发生异常,那么回滚 x=rMjz-`_
cn.rollback();