java 数据库基本操作 3n/U4fn_
1、java数据库操作基本流程 ;Bo{.916
2、几个常用的重要技巧: xGq,hCQHV
可滚动、更新的记录集 VrA9}"1x~*
批量更新 = !'gV:M
事务处理 $Blo`'
3r?Bnf:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I#D{6%~
1、取得数据库连接 /YWoDHL
1)用DriverManager取数据库连接 nl|}_~4U
例子 @O<kjR<b
String className,url,uid,pwd; z./M^7v?
className = "oracle.jdbc.driver.OracleDriver"; 50oNN+;=R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; kE tYuf^
uid = "system"; Lnnl++8Y
pwd = "manager"; `RUr/|S
Class.forName(className); cjf}yn
Connection cn = DriverManager.getConnection(url,uid,pwd); :Xv3< rS<
2)用jndi(java的命名和目录服务)方式 mfO:#]K
例子 zm}4=Kz}
String jndi = "jdbc/db"; z)'dDM D"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); hSc$Sa8
DataSource ds = (DataSource) ctx.lookup(jndi); ysfR@ sH7
Connection cn = ds.getConnection(); Cd.pMoS
多用于jsp中 nJF"[w, ?
2、执行sql语句 `Y-uNJ'.N
1)用Statement来执行sql语句
/_?E0r
String sql; >A|6kzC
Statement sm = cn.createStatement(); h3D8eR.
sm.executeQuery(sql); // 执行数据查询语句(select) *Wv]DV=\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~a8J"Wh
2)用PreparedStatement来执行sql语句 yOGaW~
String sql; KL!k'4JNY
sql = "insert into user (id,name) values (?,?)"; P8e1J0A
PreparedStatement ps = cn.prepareStatement(sql); W?!(/`J]
ps.setInt(1,xxx); W{l+_a{/9
ps.setString(2,xxx); MN|y5w}$u
... lDNB0Ad
ResultSet rs = ps.executeQuery(); // 查询 TSmuNCR
int c = ps.executeUpdate(); // 更新 eP-q[U?$n
-c!{';Zn
3、处理执行结果 8w~I(2S:#
查询语句,返回记录集ResultSet ~zFs/(k
更新语句,返回数字,表示该更新影响的记录数 Zgo^M,g
ResultSet的方法 JY#IeNL
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
GWgjbp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4_J*
0=U
M ]W'>g)G
4、释放连接 u4NMJnX
cn.close(); PIn' tV
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A5tY4?|
n8Jx;j
可滚动、更新的记录集 bp:WN
1、创建可滚动、更新的Statement j|9;")
1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "?V4Tl~uu
该Statement取得的ResultSet就是可滚动的 Qv,|*bf
2、创建PreparedStatement时指定参数 3@?#4]D{'
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ob?>zsx
ResultSet.absolute(9000); "[(_C&Ot4
批量更新 )h,+>U@
1、Statement `!DrB08A
Statement sm = cn.createStatement(); 9j:t}HV
sm.addBatch(sql1); <wxI>T }b
sm.addBatch(sql2); @D-l_[
... H=z@!rJc.
sm.executeBatch() mQBq-;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3Ec5:Caz
2、PreparedStatement m,$oV?y>j
PreparedStatement ps = cn.preparedStatement(sql); ZebXcT ,41
{
9k ]$MR
ps.setXXX(1,xxx); 4QdY"s(n
... iCao;Zb
ps.addBatch(); C',D"
} m>$+sMZE
ps.executeBatch(); dl@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,2DKp hh
oDTt+b
事务的处理 ?UoA'~=
1、关闭Connection的自动提交 1?`,h6d*=
cn.setAutoCommit(false); q*TH),)J
2、执行一系列sql语句 "0+_P{w+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @P6K`'.0
Statement sm ; U^?/nRZ
sm = cn.createStatement(insert into user...); ]|( (&Y
rl
sm.executeUpdate(); ouK&H|'
sm.close(); bT*MJ7VVm
sm = cn.createStatement("insert into corp...); S&8gZ~B
sm.executeUpdate(); +?[TH?2c+
sm.close(); xaX3<V@S
3、提交 u }D.yI8
cn.commit(); 3/>McZ@OH
4、如果发生异常,那么回滚 Byyus[b'A
cn.rollback();