java 数据库基本操作 c|1&lYal;
1、java数据库操作基本流程 5-G@L?~Vw
2、几个常用的重要技巧: "\=U)CJ
可滚动、更新的记录集 "vGW2~*)
批量更新 D-4f.Tq4#
事务处理 l(q ,<[O
nOz.G"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;6wA"
1、取得数据库连接 'QIqBU'~
1)用DriverManager取数据库连接 n(|^SH4$b
例子 %IRi1EmN8
String className,url,uid,pwd; o]:9')5^
className = "oracle.jdbc.driver.OracleDriver"; \L\b $4$d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0RK!/:'
uid = "system"; LK"69Qx?5q
pwd = "manager"; |I|fMF2K
Class.forName(className); R$Q.sE
Connection cn = DriverManager.getConnection(url,uid,pwd); F>cv<l
=6l
2)用jndi(java的命名和目录服务)方式 _[y/Y\{I
例子 '7@R7w!E4H
String jndi = "jdbc/db"; :eg4z )
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )Wox Mmz
DataSource ds = (DataSource) ctx.lookup(jndi); Z<4AL\l 98
Connection cn = ds.getConnection();
^I)N. 5
多用于jsp中 e$pV%5=
2、执行sql语句 <9%R\_@$H
1)用Statement来执行sql语句 g[t [/TV
String sql; * H9 8Du
Statement sm = cn.createStatement(); V_:&S2j
sm.executeQuery(sql); // 执行数据查询语句(select) :h V7>
rr
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )0R'(#
2)用PreparedStatement来执行sql语句 )Beiu*
String sql; ?rup/4|
sql = "insert into user (id,name) values (?,?)"; m9A!D
PreparedStatement ps = cn.prepareStatement(sql); Bw{I;rW{2
ps.setInt(1,xxx); ukY"+&
ps.setString(2,xxx); S+2(f> Z
... h*Pc=/p
ResultSet rs = ps.executeQuery(); // 查询 f`/x"@~H5
int c = ps.executeUpdate(); // 更新 ,iq4Iw
t_suF$
3、处理执行结果 Ki~1qu:
查询语句,返回记录集ResultSet yOg+iFTr
更新语句,返回数字,表示该更新影响的记录数 \j)E5b+
ResultSet的方法 I9Fr5p-%O
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9k~8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~!3r&(
PzR[KUK
4、释放连接 PY0j9$i?
cn.close(); o+9j?|M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xRsWI!d+|
6u}</>}
可滚动、更新的记录集 r)6M!_]AW
1、创建可滚动、更新的Statement Z`BK/:vo3H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %!L9)(}"
该Statement取得的ResultSet就是可滚动的 Ib0ZjX6
2、创建PreparedStatement时指定参数 nJLFfXWx
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); KK%M~Y+tU'
ResultSet.absolute(9000); TBrPf-Xr
批量更新 +t:0SRSt
1、Statement (@}!0[[^
Statement sm = cn.createStatement(); V#}kwON
sm.addBatch(sql1); kE(mVyLQ
sm.addBatch(sql2); 0<B$#8
... tdaL/rRe
sm.executeBatch() v]c6R-U
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /^|Dbx!u
2、PreparedStatement n\.V qe
PreparedStatement ps = cn.preparedStatement(sql); LYg-
.~<I
{ HX{`VahE
ps.setXXX(1,xxx); t!\tF[9e
... XF_pN[}
ps.addBatch(); C{XmVc.
} f>Jr|#k
ps.executeBatch(); K!]/(V(}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *r% c
6B
?twh)
事务的处理 0,8okAH
1、关闭Connection的自动提交 |id
<=Xf
cn.setAutoCommit(false); j9OG\m
2、执行一系列sql语句 d&s9t;@=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close O5t[
Statement sm ; Y7[jqb1D
sm = cn.createStatement(insert into user...); -\n@%$M]G
sm.executeUpdate(); 'oC)
NpnH
sm.close(); l?^4!&Nm
sm = cn.createStatement("insert into corp...); @k/NY*+
sm.executeUpdate(); g
SAt@2*U2
sm.close(); U~l$\c
3、提交 BIWWMg
cn.commit(); P_p<`sC9
4、如果发生异常,那么回滚 )D82N`c2\i
cn.rollback();