java 数据库基本操作 aM5Hp>'nI
1、java数据库操作基本流程 yDapl(
2、几个常用的重要技巧: )U|0vr8:
可滚动、更新的记录集
E!EENg
批量更新 @|2sF
事务处理 #1)#W6 h\
=w;~1i%.k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~J:qG9|]}
1、取得数据库连接 zhZ!!b^6<
1)用DriverManager取数据库连接 @@W-]SR
例子 mYx6JU*`
String className,url,uid,pwd; b[U;P=;=
className = "oracle.jdbc.driver.OracleDriver"; uqHI/4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;$Pjl8\
uid = "system"; d~abWBgC`
pwd = "manager"; )+ (GE
Class.forName(className); jvQpfd
Connection cn = DriverManager.getConnection(url,uid,pwd); Vi=u}(*
2)用jndi(java的命名和目录服务)方式 pgw_F
例子 L3;cAb/
String jndi = "jdbc/db"; /{R>o0oW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); S*l=FRFI
DataSource ds = (DataSource) ctx.lookup(jndi); d-{1>\-_
Connection cn = ds.getConnection(); s&d!+-\6_
多用于jsp中 wbQs>pc
2、执行sql语句 ){< qp
1)用Statement来执行sql语句 9dCf@5]
String sql; 'H8b+
Statement sm = cn.createStatement(); ET0^_yk
sm.executeQuery(sql); // 执行数据查询语句(select) \o}=ob
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =/m$ayG
2)用PreparedStatement来执行sql语句 fB=j51Lw
String sql; 4^GIQEjx
sql = "insert into user (id,name) values (?,?)"; "1wjh=@z
PreparedStatement ps = cn.prepareStatement(sql); .b|!FWHNS
ps.setInt(1,xxx); q[TGEgG
ps.setString(2,xxx); K+<F,
P
... i%GNmD
ResultSet rs = ps.executeQuery(); // 查询 /l` "@
int c = ps.executeUpdate(); // 更新 TCI)L}L|
/?%1;s:'
3、处理执行结果 =m-nvXD
查询语句,返回记录集ResultSet R ~? 9+
更新语句,返回数字,表示该更新影响的记录数 yvCX
is
ResultSet的方法 w6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dZkj|Ua~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uskJ(!
P,<pG[^K
4、释放连接 *"d['V3
cn.close(); x/L(0z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Yn5a4
}X9G(`N(}
可滚动、更新的记录集 @/8O@^
1、创建可滚动、更新的Statement @(CJT-Ak
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c[+uwO~
该Statement取得的ResultSet就是可滚动的 |>/m{L[
2、创建PreparedStatement时指定参数 M@ =VIrX,m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); HhB&vi
ResultSet.absolute(9000); "IJ 9vXI
批量更新 9P& \2/ {
1、Statement 63SmQsv
Statement sm = cn.createStatement(); !BDJU
sm.addBatch(sql1); R*O<(
sm.addBatch(sql2); PUEEfq!%
... `u"
)*Q}
sm.executeBatch() B-oQjr-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $u cmE
2、PreparedStatement 7v
V~O@JP
PreparedStatement ps = cn.preparedStatement(sql); si1Szmx,
{ avb'dx*q>
ps.setXXX(1,xxx); =sUrSVUeU
... c7@[RG !
ps.addBatch(); =`g@6S
} x"~gulcz
ps.executeBatch(); b[^|.>b
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 glomwny
2CRgOFR
事务的处理 JIXZI\Fk
1、关闭Connection的自动提交 ~\OZEEI
cn.setAutoCommit(false); %?PRBE'}'
2、执行一系列sql语句 :~Ppv5W.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i#%!J:_=
Statement sm ; '3]M1EP
sm = cn.createStatement(insert into user...); k;f%OQsF_
sm.executeUpdate(); M.K%;j`
sm.close(); ~=t K17i
sm = cn.createStatement("insert into corp...); r*g<A2g%
sm.executeUpdate(); 4tlLh`-8
sm.close(); RA*W Ys&xb
3、提交 ei!Yxw8d
cn.commit(); BM[jF=0
4、如果发生异常,那么回滚 o)+Uyl
cn.rollback();