java 数据库基本操作 wY3|5kbDj
1、java数据库操作基本流程 C(kL=WD
2、几个常用的重要技巧: vF)eo"_s*
可滚动、更新的记录集 }WHq?
批量更新 pd-I^Q3-
事务处理 NRazI_Z
.$o
A~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7G%:ckg
1、取得数据库连接 +0)H~
qB\
1)用DriverManager取数据库连接 DB(!*6#?
例子 LIn2&r:U
String className,url,uid,pwd; onl,R{,`0
className = "oracle.jdbc.driver.OracleDriver"; YT6dI"48
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Q9i[?=F:z
uid = "system"; Fz' s\
pwd = "manager"; 0+/ew8~$
Class.forName(className); o{3>n"\w3
Connection cn = DriverManager.getConnection(url,uid,pwd); *W2o$_Hs
2)用jndi(java的命名和目录服务)方式 OR}+)n{
例子 .R)uk
String jndi = "jdbc/db"; 49YN@PXC
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); klnk{R.>|
DataSource ds = (DataSource) ctx.lookup(jndi); KxDp+]N]
Connection cn = ds.getConnection(); zbj V>5
多用于jsp中 A=wG};%_
2、执行sql语句 I3u)y|Y=
1)用Statement来执行sql语句 CZf38$6 X
String sql; qB3E
Statement sm = cn.createStatement(); 7&u$^c S(
sm.executeQuery(sql); // 执行数据查询语句(select) ;,s9jw
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); vU$n*M1`$
2)用PreparedStatement来执行sql语句 J,\e@
String sql; @2;cv?i)
sql = "insert into user (id,name) values (?,?)"; {W HK|l
PreparedStatement ps = cn.prepareStatement(sql); $W%-Mm
ps.setInt(1,xxx); FIUQQQ\3
ps.setString(2,xxx); [&kz4_
... *K BaKS
ResultSet rs = ps.executeQuery(); // 查询 _fSBb<
int c = ps.executeUpdate(); // 更新 Ss_}@p ^
O{0it6
3、处理执行结果 txE+A/>i9
查询语句,返回记录集ResultSet TFAR>8Nm
更新语句,返回数字,表示该更新影响的记录数 ~/XDA:nfL:
ResultSet的方法 Wg2 0H23XW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false v7\rW{~Jd&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =2}V=E/85
SM8_C!h:
4、释放连接 `jVRabZ0
cn.close(); 6b9J3~d\E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection k SgE_W)
pC #LQ
可滚动、更新的记录集 |>Fz:b d
1、创建可滚动、更新的Statement %k~ezn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4c[/%e:\-
该Statement取得的ResultSet就是可滚动的 #2Iag'4T
2、创建PreparedStatement时指定参数 E^Q
J50
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); |* ^LsuFb
ResultSet.absolute(9000); _GrifGU\
批量更新
C|h Uyo
1、Statement @BG].UJo
Statement sm = cn.createStatement(); K/j u=>
sm.addBatch(sql1); {&UA60~6
sm.addBatch(sql2); BC\W`K
... }r@yBUW
sm.executeBatch() !0vLSF=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %M))Ak4~a
2、PreparedStatement ;<_a ,5\Q
PreparedStatement ps = cn.preparedStatement(sql); boHbiE
{ A=IpP}7J
ps.setXXX(1,xxx); 7mf&`.C
np
... 3zu6#3^
ps.addBatch(); EW1,&H
} h(<>s#=E
ps.executeBatch(); \P")Eh =d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <i]0EE}%
R PoBF~>
事务的处理 @0]WMI9B"B
1、关闭Connection的自动提交 :~#)Xa0I
cn.setAutoCommit(false); u&^KrOM@#
2、执行一系列sql语句 AI|+*amTd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close aKWxL e
Statement sm ; @d^Z^H*Yv
sm = cn.createStatement(insert into user...); ^+v1[U@
sm.executeUpdate(); d~QM@<SV
sm.close(); %y|pVN!U
sm = cn.createStatement("insert into corp...); dR;N3KwY
sm.executeUpdate(); G"OP`OMDc
sm.close(); ;+(VO
3、提交 /t`\b
[
cn.commit(); 8Znr1=1
4、如果发生异常,那么回滚 Tjq1[Wq
cn.rollback();