java 数据库基本操作 eq%cRd]u
1、java数据库操作基本流程 2;>uP#1]
2、几个常用的重要技巧: a@jM%VZ
可滚动、更新的记录集 OET/4(C
批量更新 ~D}fy
事务处理 C}<e3BXc
D=z="p\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]!sCWR
1、取得数据库连接 6?%$e$s
1)用DriverManager取数据库连接 F%$ q]J[
例子 K<::M3eQ
String className,url,uid,pwd; dF 6od
className = "oracle.jdbc.driver.OracleDriver"; *q=\e 9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7J5jf231
uid = "system"; QnBWZUI
pwd = "manager"; &F:.V$
Class.forName(className); ;%
KS?;%[
Connection cn = DriverManager.getConnection(url,uid,pwd); B.od{@I(Xp
2)用jndi(java的命名和目录服务)方式 FIfLDT+ Wh
例子 [Q8Wy/o
Q
String jndi = "jdbc/db"; H'udxPF
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qzO Rv
DataSource ds = (DataSource) ctx.lookup(jndi); Tim/7*vx
Connection cn = ds.getConnection(); !:5'MI@
多用于jsp中 w@R" g%k-
2、执行sql语句 zfI{cMn'J
1)用Statement来执行sql语句 YI*H]V%w
String sql; G$'UK
Statement sm = cn.createStatement(); 9]ZfSn)
sm.executeQuery(sql); // 执行数据查询语句(select) (-0d@eqw
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :}fA98S
2)用PreparedStatement来执行sql语句 (D?4*9=
String sql; }z/%b<o_
sql = "insert into user (id,name) values (?,?)"; hNYO+LrI)
PreparedStatement ps = cn.prepareStatement(sql); zQ,M795@EA
ps.setInt(1,xxx); x2&5zp
ps.setString(2,xxx); q]pHD})O
... @|"K"j#
ResultSet rs = ps.executeQuery(); // 查询 n+&8Uk
int c = ps.executeUpdate(); // 更新 7_Te-i
Z?qLn6y1W
3、处理执行结果 1>\V>g9
查询语句,返回记录集ResultSet DAf@-~c
更新语句,返回数字,表示该更新影响的记录数 Q.jThP`p
ResultSet的方法 -wx~*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 'L7u`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @N<h`vDa
GY@:[u.&
4、释放连接 ;AVIt!(L~V
cn.close(); LU8[$.P
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ( 1
5c}loOq
可滚动、更新的记录集 o-&0_Zq_
1、创建可滚动、更新的Statement W+8s>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r7V !M1
该Statement取得的ResultSet就是可滚动的 bM?29cs
2、创建PreparedStatement时指定参数 GSSmlJ`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); di+|` O
ResultSet.absolute(9000); JQej$=*
批量更新 x;:jF_
1、Statement &+k*+
Statement sm = cn.createStatement(); /3hY[#e
sm.addBatch(sql1); ?-2s}IJO
sm.addBatch(sql2); XefmC6X
... ~@Bw(!
sm.executeBatch() `5(F'o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 iT|7**+3
2、PreparedStatement sdB(sbSF
PreparedStatement ps = cn.preparedStatement(sql); S?JGg.)
{ vN_ 8qzWk
ps.setXXX(1,xxx); *fj]L?,
... YZ:C9:S6X
ps.addBatch(); m}D;=>2$
} G `3{Q7k
ps.executeBatch(); {0a\<l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Vh=U/{Rp1
4,R"(ej
事务的处理 *CQZ6&^
1、关闭Connection的自动提交 xj8z*fC;
cn.setAutoCommit(false); ^jRX6
2、执行一系列sql语句 `s+kYWg'Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close j$lf>.[I
Statement sm ; WPpO(@sn
sm = cn.createStatement(insert into user...); f<rn't{
sm.executeUpdate(); 9Qu(RbDqC
sm.close(); =<PEvIn
sm = cn.createStatement("insert into corp...); ':tdb$h
sm.executeUpdate(); s~>1TxJe
sm.close(); aqK+ u.H
3、提交 g2==`f!i
cn.commit(); 8Ed axeDq
4、如果发生异常,那么回滚 .=-a1p/
cn.rollback();