java 数据库基本操作 W>|b98NPu
1、java数据库操作基本流程 v|RaB
2、几个常用的重要技巧: K<w5[E9V.
可滚动、更新的记录集 \\G6c4fC
批量更新 'MQGR@*
事务处理 ^$,kTU'=
U?^|>cMr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Z%9^6kdY
1、取得数据库连接 wG?kcfu
1)用DriverManager取数据库连接 }7z+
例子 kJeOlO[
String className,url,uid,pwd; Xsn - +e
className = "oracle.jdbc.driver.OracleDriver"; ; F(01
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;,})VoC\!
uid = "system"; l(#Y8
pwd = "manager"; kZ[yv
Class.forName(className); ,L:)ZZgN
Connection cn = DriverManager.getConnection(url,uid,pwd); h16Nr x
2)用jndi(java的命名和目录服务)方式 Tc(v\|F,
例子 8=o(nFJw
String jndi = "jdbc/db"; fvM3.P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); jTgh+j]AP
DataSource ds = (DataSource) ctx.lookup(jndi); ,k! f`
Connection cn = ds.getConnection(); _r|ytQ)
多用于jsp中 >`|uc
2、执行sql语句 BXv)zE=j
1)用Statement来执行sql语句 *-LU'yM6Yh
String sql; ~JPzjE
Statement sm = cn.createStatement(); <~X6D?
sm.executeQuery(sql); // 执行数据查询语句(select) 4KSN;G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); t8N9/DZ}Q
2)用PreparedStatement来执行sql语句 RcM0VbR"EU
String sql; "K!BJQ
sql = "insert into user (id,name) values (?,?)"; P1 >X5:
PreparedStatement ps = cn.prepareStatement(sql); HbSx}bM_9
ps.setInt(1,xxx); _rJSkZO
ps.setString(2,xxx); g uWqHVSs
... ^JDV4>S\
ResultSet rs = ps.executeQuery(); // 查询 ~ A|*]0,
int c = ps.executeUpdate(); // 更新 ~2}ICU5
kj=2+)!E7
3、处理执行结果 7Ej#7\TB]
查询语句,返回记录集ResultSet q.F1Jj
更新语句,返回数字,表示该更新影响的记录数 r3vj o(
ResultSet的方法 I_*>EA
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hD"~
^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &D w~Jq|
0U*"OSpF
4、释放连接 '="){
cn.close(); }B/xQsTx-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +r P<m
R_&z2I
可滚动、更新的记录集 Q^w]Nj(e_
1、创建可滚动、更新的Statement :P"Gym
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ppP?1Il`kb
该Statement取得的ResultSet就是可滚动的 .Q)"F /
2、创建PreparedStatement时指定参数 I>Yp=R
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P`"DepeD
ResultSet.absolute(9000); !|c5@0Wr
批量更新 Hv*O9!cC
1、Statement 1&"1pH
Statement sm = cn.createStatement(); K(<P" g(
sm.addBatch(sql1); 2Hwf:S'
sm.addBatch(sql2); w! 7/;VJ3d
... 3U$fMLx]k
sm.executeBatch() 6
74X)hB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7~f6j:{|z
2、PreparedStatement k8V0-.UL}
PreparedStatement ps = cn.preparedStatement(sql); RR=l&uT
{ QLG,r^
ps.setXXX(1,xxx); lM,:c.R
... ]#.# ]}=
ps.addBatch(); 2]ljm]\l
} b;l%1x9r
ps.executeBatch(); oP
0j>i,"&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 P[i/o#
EtGr&\,
事务的处理 eqCB2u"Jq
1、关闭Connection的自动提交 z\
pT+9&
cn.setAutoCommit(false); &,7(Wab
2、执行一系列sql语句 ~vFo 0k(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7^=jv~>wP
Statement sm ; /WVMT]T6^,
sm = cn.createStatement(insert into user...); RUu'9#fq
sm.executeUpdate(); c= uORt>
sm.close(); /p"R}&z
sm = cn.createStatement("insert into corp...); +ETw:i9!?
sm.executeUpdate(); r+u\jZ
sm.close(); =x>k:l~s
3、提交 _P1-d`b0 a
cn.commit(); /]&1 XT?
4、如果发生异常,那么回滚 MJ08@xGa
cn.rollback();