java 数据库基本操作 a/xCl
:=8q
1、java数据库操作基本流程 ynz5Dy.d;
2、几个常用的重要技巧: ;]ZHD$g
可滚动、更新的记录集 bsS|!KT
批量更新 E52:c]<'m
事务处理 ZCq\Zk1O&
,}xC) >
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 5Szo5
1、取得数据库连接 )pj \b[
1)用DriverManager取数据库连接 'aSORVq^e[
例子 oFA$X Y
String className,url,uid,pwd; =:T:9Y_ i
className = "oracle.jdbc.driver.OracleDriver"; ,PtR^" Mf4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GTX&:5H\t
uid = "system"; (IWd?,H,n
pwd = "manager"; e@MCumc~+
Class.forName(className); $7ME a"a
Connection cn = DriverManager.getConnection(url,uid,pwd); %-zH]"Q$
2)用jndi(java的命名和目录服务)方式 =>TtX@ Q{
例子 $TUC?e9"h
String jndi = "jdbc/db"; w@D@,q'x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >}`1'su
DataSource ds = (DataSource) ctx.lookup(jndi); iDe0 5f1R
Connection cn = ds.getConnection(); -cS4B//IK8
多用于jsp中 2yg'?tpj
2、执行sql语句 Wa<NId
1)用Statement来执行sql语句 t"m`P1
String sql; Z-=7QK.\{
Statement sm = cn.createStatement(); &]A1 _dy
sm.executeQuery(sql); // 执行数据查询语句(select) +.Ukzu~s
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); P>cJ~FM
2)用PreparedStatement来执行sql语句 m<;" 1<k
String sql; o`]FH_
sql = "insert into user (id,name) values (?,?)"; +Gs;3jC^
PreparedStatement ps = cn.prepareStatement(sql); W;*vcbP
ps.setInt(1,xxx); ' <jp.sZQ
ps.setString(2,xxx); ?9M+fi
... YmF(o
ResultSet rs = ps.executeQuery(); // 查询 2QD
B'xs3
int c = ps.executeUpdate(); // 更新 Tl{r D(D
)4O`%9=M&
3、处理执行结果 MjosA R
查询语句,返回记录集ResultSet r/w@Dh]{_
更新语句,返回数字,表示该更新影响的记录数 -&^( T
ResultSet的方法 {;gWn'aq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @MVZy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 lY8Qy2k|
r3K:
4、释放连接 w'j]Y%
cn.close(); [?(W7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ziip*<a!_
AZP>\Dq
可滚动、更新的记录集 gI$`d?[0{
1、创建可滚动、更新的Statement z?g4^0e
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^E,UcK;
该Statement取得的ResultSet就是可滚动的 "s^@PzQpN
2、创建PreparedStatement时指定参数 ;^SgV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y\F H4}\S
ResultSet.absolute(9000); ijSYQ
批量更新 Y'":OW#oN
1、Statement DdW8~yI&
Statement sm = cn.createStatement(); IWd*"\L
sm.addBatch(sql1); %&S]cEw
sm.addBatch(sql2); M0\[hps~X
... S5p\J!k\B
sm.executeBatch() ^ @cX0_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9%veUvY
2、PreparedStatement N>iCb:_
T;
PreparedStatement ps = cn.preparedStatement(sql); D($UbT-v
{ *m/u 3.\
ps.setXXX(1,xxx); p5w g+K
... 4&WzGnK
ps.addBatch(); D*b|(Oi
} '\qr=0aW
ps.executeBatch(); FX%E7H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 dXN&<Q,
?XrTZ{5'
事务的处理 TUCpmj
1、关闭Connection的自动提交 2o}FB\4^i
cn.setAutoCommit(false); 7i\[Q8f
2、执行一系列sql语句 5Wjp_^!e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uU"s50m
Statement sm ; 6!m#_z8qG3
sm = cn.createStatement(insert into user...); f2XD^:Gc
sm.executeUpdate(); e;\c=J,eE
sm.close(); NV ~i4R*#
sm = cn.createStatement("insert into corp...); Hc3/`.nt
sm.executeUpdate(); {[iQRYD0|
sm.close(); @K>Pw arl
3、提交 |bUmkw
cn.commit(); G*V
7*KC
4、如果发生异常,那么回滚 NsK >UJ'
cn.rollback();