java 数据库基本操作 q-3J.VLJ5H
1、java数据库操作基本流程 e<L 9k}c
2、几个常用的重要技巧: o]|oAN9
可滚动、更新的记录集 lrmt)BLoh
批量更新 f>s#Ngvc
事务处理 2w x[D
~b>nCP8q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;Z!~A"~$>
1、取得数据库连接
'{j\0
1)用DriverManager取数据库连接 NWQPOq#
例子 p-T~x$"c|
String className,url,uid,pwd; m0BG9~p|
className = "oracle.jdbc.driver.OracleDriver"; de=5=>P7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; U5On-T5
uid = "system"; W;OYO
pwd = "manager"; Jm]]>K8.3V
Class.forName(className); [.#p
Connection cn = DriverManager.getConnection(url,uid,pwd); f
gK2.;>
2)用jndi(java的命名和目录服务)方式 {p#l!P/
例子 EBj,pk5M
String jndi = "jdbc/db"; d739UhKC
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); r|\5'ZMx
DataSource ds = (DataSource) ctx.lookup(jndi); %67G]?EXB
Connection cn = ds.getConnection(); r{R[[]p
多用于jsp中 EaM"=g
2、执行sql语句 r21?c|IP
1)用Statement来执行sql语句 dr,B\.|jC
String sql; D% v:PYf
Statement sm = cn.createStatement(); PEX26==
sm.executeQuery(sql); // 执行数据查询语句(select) _q$0lqq~u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ONr?.MJ6j
2)用PreparedStatement来执行sql语句 :>tF_6
String sql; S|{Yvyp
sql = "insert into user (id,name) values (?,?)"; {UX"Epd);n
PreparedStatement ps = cn.prepareStatement(sql); KD,^*FkkL
ps.setInt(1,xxx); AMh37Xo
ps.setString(2,xxx); r%Q8)nEo
... .\ ;l-U
ResultSet rs = ps.executeQuery(); // 查询 r+[#%%}ea
int c = ps.executeUpdate(); // 更新 ="5k\1W1M
r/N[7*i
3、处理执行结果 |aI|yq)
查询语句,返回记录集ResultSet IL+#ynC
更新语句,返回数字,表示该更新影响的记录数 XI%RneuDr:
ResultSet的方法 +X* F<6mZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ' D)1ka.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ; d, JN
KA|&Q<<{@
4、释放连接 27Kc-rcB
cn.close(); |MOn0*
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
nR,Qm=;
<O,'5+zG%
可滚动、更新的记录集 ++Rdv0~
1、创建可滚动、更新的Statement M&|sR+$^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); S4l)TtY
该Statement取得的ResultSet就是可滚动的 dJdD"xj
2、创建PreparedStatement时指定参数 D_l/Gxdpr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {+@ms$z
ResultSet.absolute(9000); QmWC2$b
批量更新 /32Ta
1、Statement '|YtNhWZ?
Statement sm = cn.createStatement(); K:>NGGY8r
sm.addBatch(sql1); L<f-Ed9|
sm.addBatch(sql2); tl{]gz
... ql!5m\
sm.executeBatch() p/ziFpU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ek"YM[
2、PreparedStatement 8_^'(]
PreparedStatement ps = cn.preparedStatement(sql); uD.
{ >Jm-2W5J
ps.setXXX(1,xxx); \&eY)^vw
... =gMaaGg p,
ps.addBatch(); ' +)6#/*
} cwH,l$
ps.executeBatch(); MAuM)8_P/|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ppwd-^f3j
S`pF7[%rp
事务的处理 !6XvvTs/<
1、关闭Connection的自动提交 t Y:G54d=_
cn.setAutoCommit(false); hrJ$%U
2、执行一系列sql语句 9O),/SH;:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g>6:CG"
Statement sm ; HO266M
sm = cn.createStatement(insert into user...); 89*S?C1
sm.executeUpdate(); bh= \
sm.close(); Tjd&^m
sm = cn.createStatement("insert into corp...); [=XZza.z
sm.executeUpdate(); T5K-gz7A
sm.close(); K%Usjezv&
3、提交 )HJK '@
cn.commit(); + 6x"trC
4、如果发生异常,那么回滚 GAg.p?Sq
cn.rollback();