java 数据库基本操作 f-\l<o(
1、java数据库操作基本流程 DOXRU5uP3
2、几个常用的重要技巧: ~~ON!l9n
可滚动、更新的记录集 Hc@Z7eQ3^
批量更新 r[$Qtj Q
事务处理 FVsNOU
|yI?}zyR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^yRCR] oT
1、取得数据库连接 WPE@yI(
1)用DriverManager取数据库连接 ubhem(p#
例子 oh;F]*k6
String className,url,uid,pwd; b>%I=H%g
className = "oracle.jdbc.driver.OracleDriver"; EMH?z2iGd
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `.dTkL
uid = "system"; ^}8_tZs8\
pwd = "manager"; p;n )YY$
Class.forName(className); U6=m4]~Z
Connection cn = DriverManager.getConnection(url,uid,pwd); )_EobE\
2)用jndi(java的命名和目录服务)方式 0nAeeVz|
例子 Iw"?%k\U
String jndi = "jdbc/db"; H[x 9 7r
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ji(S ?^
DataSource ds = (DataSource) ctx.lookup(jndi); D0QXvrf
Connection cn = ds.getConnection(); .)Se-'
多用于jsp中 r _r$nl
2、执行sql语句 q9Y0Lk
1)用Statement来执行sql语句 UhCd,
String sql; (6\A"jey\x
Statement sm = cn.createStatement(); ,ASY
&J5)7
sm.executeQuery(sql); // 执行数据查询语句(select) $^7&bQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); cQPH le2
2)用PreparedStatement来执行sql语句 ]dDyz[NuvD
String sql; ,)L.^<
sql = "insert into user (id,name) values (?,?)"; CWkm\=
PreparedStatement ps = cn.prepareStatement(sql); No[xf9>t
ps.setInt(1,xxx); HIhoYSwB
ps.setString(2,xxx); >[xQUf,p
... I{cn ,,8
ResultSet rs = ps.executeQuery(); // 查询 S0=BfkHi.
int c = ps.executeUpdate(); // 更新 *OF7{^~&
7<.f&1MgI
3、处理执行结果 4
qW)R{%
查询语句,返回记录集ResultSet n?,fF(
更新语句,返回数字,表示该更新影响的记录数 {/7'uD\
H
ResultSet的方法 v;K\#uc_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !s)2H/KM 8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $]81 s`
Q)a*bPz
4、释放连接 *pasI.2s#
cn.close(); iCx'`^HnP
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q}2w~Cn\S
vJq`l3&
可滚动、更新的记录集 jv0e&rt
1、创建可滚动、更新的Statement >8NQ8i=]V1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >Ft jrEB
该Statement取得的ResultSet就是可滚动的 `ZefSmb
2、创建PreparedStatement时指定参数 FpRK^MEkG
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V,M8RYOnC!
ResultSet.absolute(9000); _F3vC#
批量更新 Ar'5kPzY>
1、Statement GV[[[fu
Statement sm = cn.createStatement(); d&'6l"${
sm.addBatch(sql1); @pkozE-
sm.addBatch(sql2); mI`dZ3h
... ;5=pBP.
sm.executeBatch() 98 O z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 U3U eTa_
2、PreparedStatement x@k9]6/zs
PreparedStatement ps = cn.preparedStatement(sql); rfPJBD{Ve
{ *p WswcV/
ps.setXXX(1,xxx); E_y h9lk
... &FanD
ps.addBatch(); zu|pL`X
} sU}e78m h
ps.executeBatch(); \R#XSW,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i([A8C_A
Ns9g>~
事务的处理 :e9E#o
1、关闭Connection的自动提交 [w4z)!
cn.setAutoCommit(false); 3> fuH'=
2、执行一系列sql语句 )US)-\^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nEn2!)$
Statement sm ; Aio0++r-
sm = cn.createStatement(insert into user...); "iydXV=Q
sm.executeUpdate(); %Bo Jt-v
sm.close(); o4Ba l^=[
sm = cn.createStatement("insert into corp...); $Y4
Ao-@
sm.executeUpdate(); ?NwFpSB2
sm.close(); ,,iQG' *
3、提交 r-V./M@L
cn.commit(); '/p5tw8
4、如果发生异常,那么回滚 I%s/h4x^B[
cn.rollback();