java 数据库基本操作 -;"l5oX
1、java数据库操作基本流程 5wX>PJS
2、几个常用的重要技巧: l:f
sZO4
可滚动、更新的记录集 ?s33x#
批量更新 gwNkjI=,
事务处理 pj]<i.p
+(%[f W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Kjw\SQ)2~
1、取得数据库连接 hhhO+D1(
1)用DriverManager取数据库连接 nVzo=+Yp
例子 V}qmH2h
String className,url,uid,pwd; L ai"D[N
className = "oracle.jdbc.driver.OracleDriver"; Shz;)0To
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; m@~x*+Iz
uid = "system"; U2$T}/@
pwd = "manager"; 0aWb s$FyU
Class.forName(className); Q,`kfxA`O
Connection cn = DriverManager.getConnection(url,uid,pwd); 2_X0Og8s[
2)用jndi(java的命名和目录服务)方式 CI{x/ e^(
例子 GNOC5 E$I
String jndi = "jdbc/db"; 9#!tzDOtD
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); nT"z(\i.!J
DataSource ds = (DataSource) ctx.lookup(jndi); {+Yo&F}n
Connection cn = ds.getConnection(); Dy!fwYPA/{
多用于jsp中 }}_l@5
2、执行sql语句 &)-?=M
1)用Statement来执行sql语句 F}>`3//u
String sql; BYU.ptiJJ
Statement sm = cn.createStatement(); ]U%Tm>s.
sm.executeQuery(sql); // 执行数据查询语句(select) A4' aB0^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $ cSZX#\
2)用PreparedStatement来执行sql语句 2l?J9c}Wo
String sql; <H 6Uo#ao
sql = "insert into user (id,name) values (?,?)"; ^h=kJR9
PreparedStatement ps = cn.prepareStatement(sql); W6Pg:Il7
ps.setInt(1,xxx); C.<4D1}P
ps.setString(2,xxx); Di*>PE@
... 6-"&jbvm
ResultSet rs = ps.executeQuery(); // 查询 Je,8{J |e
int c = ps.executeUpdate(); // 更新 ;rgsPVbVf
S##W_OlrI
3、处理执行结果 fF%r$`2
查询语句,返回记录集ResultSet G>x0}c
更新语句,返回数字,表示该更新影响的记录数 ~55>uw<
ResultSet的方法 'oG'`ED"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false BxF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dp_q:P4;B
soF ^G21N
4、释放连接 g 7X>i:
cn.close(); ,dBI=D'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection m='OnTeOE
4<|u~n*JF
可滚动、更新的记录集 {SV$fl;
1、创建可滚动、更新的Statement zdCt#=QV?R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Za w+
该Statement取得的ResultSet就是可滚动的 JK4 @
2、创建PreparedStatement时指定参数 CR<l"~X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2dfA}i>k
ResultSet.absolute(9000); h%%'{^>~
批量更新 >nX'RE|F
1、Statement EcU9Tm`h
Statement sm = cn.createStatement(); wal }[F#
sm.addBatch(sql1); 71_N9ub@z
sm.addBatch(sql2); q9Q4F
... RswR DLl
sm.executeBatch() <vs.Ucxx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =#fqFL,
2、PreparedStatement
kel48B
PreparedStatement ps = cn.preparedStatement(sql); U*cj'`eqC
{ _wBPn6gg`
ps.setXXX(1,xxx); 2 O%UT?R
... 6k2~j j1d
ps.addBatch(); Y2Bu,/9^
} w]_a0{Uh
ps.executeBatch(); JS9q'd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zw?6E8$h
C$8=HM3
事务的处理 e
6*=Si}V
1、关闭Connection的自动提交 S:gP\Atf>
cn.setAutoCommit(false); # V+e
2、执行一系列sql语句 * 7CI q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _),@^^&x
Statement sm ; bTj,5,8i
sm = cn.createStatement(insert into user...); <$E8T>U
sm.executeUpdate(); vJ!t.Vou
sm.close(); R-ci?7d t3
sm = cn.createStatement("insert into corp...); /-T%yuU
sm.executeUpdate(); R##O9BSI8Z
sm.close(); y03l_E,
3、提交 HM/ qB^
cn.commit(); 7DDot_qb
4、如果发生异常,那么回滚 kDsUKO
p
cn.rollback();