java 数据库基本操作 A2htD!3
1、java数据库操作基本流程 gl HHr
2、几个常用的重要技巧: CbwQ'c$}
可滚动、更新的记录集 ?HU(0Vgn'
批量更新 EXo"F*gW
事务处理 :5p`H
|nv8&L8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S{&;
1、取得数据库连接 -u8 ma%JW
1)用DriverManager取数据库连接 +jQW 6k#
例子 -k!UcMWP
String className,url,uid,pwd; w 8T#~Dc
className = "oracle.jdbc.driver.OracleDriver"; ,@(lYeD"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @_0XK)pW
uid = "system"; ql^n=+U
pwd = "manager"; F DXAe-|Q
Class.forName(className); $FS
j^v]
Connection cn = DriverManager.getConnection(url,uid,pwd); wR\%tumk
2)用jndi(java的命名和目录服务)方式 +.gZILw
例子 PC=b.H8P+W
String jndi = "jdbc/db"; bm`x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _@SC R%
DataSource ds = (DataSource) ctx.lookup(jndi); ?3"lI,!0
Connection cn = ds.getConnection(); @2Z{en?
多用于jsp中 Np+<)q2
2、执行sql语句 08cCrG
1)用Statement来执行sql语句 =5',obYN>c
String sql; _KLKa/3
Statement sm = cn.createStatement(); J?LetyDNr]
sm.executeQuery(sql); // 执行数据查询语句(select) 9K~X}]u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 0.=dOz r
2)用PreparedStatement来执行sql语句 42~tdD
String sql; g-Vxl|hR
sql = "insert into user (id,name) values (?,?)"; ?7*.S Lt
PreparedStatement ps = cn.prepareStatement(sql); iTwb#Q=
ps.setInt(1,xxx); 6 -N 442
ps.setString(2,xxx); Y2W|b5
... #8i DM5:EQ
ResultSet rs = ps.executeQuery(); // 查询 J<yt/V]
int c = ps.executeUpdate(); // 更新 :[kfWai #(
e?,n>
3、处理执行结果 F}wy7s2i
查询语句,返回记录集ResultSet r roI
更新语句,返回数字,表示该更新影响的记录数 d)1 d0ES
ResultSet的方法 ,K
8R%B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m%]1~b}"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Qzt'ZK
l|9'M'a
4、释放连接 _(l?gj
cn.close(); qHaH=g%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection k{d]
J}BN}|Y@2
可滚动、更新的记录集 w;W# 'pE
1、创建可滚动、更新的Statement N?`V;`[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^m~&2l\N=
该Statement取得的ResultSet就是可滚动的 f$ 9O0,}%O
2、创建PreparedStatement时指定参数 ( RO-~-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :y'EIf
ResultSet.absolute(9000); !mHMFwvS
批量更新 4a}[&zm(5
1、Statement p>_Qns7W
Statement sm = cn.createStatement(); _rM?g1}5j
sm.addBatch(sql1); N,W ?}
sm.addBatch(sql2); y^Uh<L0M
... GXC,p(vbE
sm.executeBatch() v|\3FEu@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 v;soJlxF~
2、PreparedStatement ~jC+6v
PreparedStatement ps = cn.preparedStatement(sql); 76H>ST@G|
{ 1r$*8|p
ps.setXXX(1,xxx); (Zg'])
... UodBK7y
ps.addBatch(); {Y-~7@
} ZtyDip'x
ps.executeBatch(); 5skxixG
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Y<L35
?
m<H{@ZgN(
事务的处理 m8@&-,T
1、关闭Connection的自动提交 KpA1Ac)T
cn.setAutoCommit(false); <O5WY37"q
2、执行一系列sql语句 %UAF~2]g
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close '2GnA ws^
Statement sm ; +F-EgF+J
sm = cn.createStatement(insert into user...); t0+i]lr
sm.executeUpdate(); 2n)?)w]!M
sm.close(); fIl;qGz85
sm = cn.createStatement("insert into corp...); y];-D>jk
sm.executeUpdate(); z/u^
sm.close(); [\AOr`7
3、提交 6<EGH*GQ$
cn.commit(); Xu8I8nAwl
4、如果发生异常,那么回滚 nl
qn:[BU
cn.rollback();