java 数据库基本操作 7oFA5T _
1、java数据库操作基本流程 X:d[eAu0
2、几个常用的重要技巧: P(Z\y^S
可滚动、更新的记录集 [eZ'h8
批量更新 q\T}jF\t
事务处理 9Lqo^+0)\
D[bPm:\0M
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~PiCA
1、取得数据库连接 ?PDrj/: *
1)用DriverManager取数据库连接 X2to](\%X
例子 -`d(>ok
String className,url,uid,pwd; zR_yxs'
className = "oracle.jdbc.driver.OracleDriver"; \aB"D=P\ok
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <n)R?P(or
uid = "system"; ]]lM)
pwd = "manager"; e3x;(@j
Class.forName(className); 73tWeZ8rvx
Connection cn = DriverManager.getConnection(url,uid,pwd); NK|m7(
2)用jndi(java的命名和目录服务)方式 HQtUNtZ
例子 o!}/&
'(
String jndi = "jdbc/db"; r!HB""w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Uiu9o]n
DataSource ds = (DataSource) ctx.lookup(jndi); V SUz+W
Connection cn = ds.getConnection(); kq=tL@W`0}
多用于jsp中 ff<adl-
2、执行sql语句 O>sE~~g]?
1)用Statement来执行sql语句 Ll'!aar,
String sql; _~_6qTv-d
Statement sm = cn.createStatement(); WDQw)EUl&
sm.executeQuery(sql); // 执行数据查询语句(select) hP26 Bb1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); atWB*kqI
2)用PreparedStatement来执行sql语句 6Rc%P)6
String sql; Z'|A>4\
sql = "insert into user (id,name) values (?,?)"; QE%|8UFY
PreparedStatement ps = cn.prepareStatement(sql); ts~$'^K[-
ps.setInt(1,xxx); iMXK_O%
ps.setString(2,xxx); SM8m\c
... TCS^nBEE
ResultSet rs = ps.executeQuery(); // 查询 +)QA!g$
int c = ps.executeUpdate(); // 更新 a@U0s+V&a0
v}-j ls
3、处理执行结果 {GM8}M~D&
查询语句,返回记录集ResultSet SWM6+i
p
更新语句,返回数字,表示该更新影响的记录数 ]#Q'~X W
ResultSet的方法 *r]Mn~3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ax"I$6n>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 /e4#DH
&4-rDR,
4、释放连接 7z4u?>pne*
cn.close(); J t,7S4JL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rCFTch"
}c-tvK1g
可滚动、更新的记录集 ?L~Z]+-
1、创建可滚动、更新的Statement Lmw{ `R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \~`qE<Q/
该Statement取得的ResultSet就是可滚动的 0&|,HK
2、创建PreparedStatement时指定参数 x8wal[6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
,1g*0W^
ResultSet.absolute(9000); Afq?Ps+
批量更新 ~\D
H[Mt
1、Statement (8/Qt\3jv
Statement sm = cn.createStatement(); -(YdK8
sm.addBatch(sql1); aok,qn'j
sm.addBatch(sql2); 3O!TVSo
... g&6O*vx
sm.executeBatch() _Q3Ad>,U
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 W mT(>JBO
2、PreparedStatement Z,bv D'u
PreparedStatement ps = cn.preparedStatement(sql); |`yzH$,F
{ ewb/Z[4
ps.setXXX(1,xxx); ]VS$ ?wD
... =\l7k<
ps.addBatch(); hV4\#K[
} Mb0cdK?hA
ps.executeBatch(); lj o^ 2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2eh j2T
3U73_=>=&
事务的处理 @YfCS8
eH
1、关闭Connection的自动提交 Cq, hzi-
cn.setAutoCommit(false); ^>f jURR
2、执行一系列sql语句 7,N>u8cTh
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close C5jR||
Statement sm ; )wwQv2E
sm = cn.createStatement(insert into user...); X[
o9^<
sm.executeUpdate(); "x$RTuWA9
sm.close(); KGI0|Z]n~
sm = cn.createStatement("insert into corp...); 1@Zjv>jy[
sm.executeUpdate(); wh<s#q`
sm.close(); >@o}l:*
3、提交 (W l5F
cn.commit(); 32*FI SH^
4、如果发生异常,那么回滚 %wp#vO-$
cn.rollback();