java 数据库基本操作 !=B=1th4
1、java数据库操作基本流程 w dpd`
2、几个常用的重要技巧: [izP1A$r#Q
可滚动、更新的记录集 ()`cW>[
批量更新 *_,: &Ur
事务处理 Ce.*yO<-
pLtAusx
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hVLVMqd
1、取得数据库连接 0V!@*Z
1)用DriverManager取数据库连接 |jw{7\+
例子 p8bAz
String className,url,uid,pwd; |3K]>Lio
className = "oracle.jdbc.driver.OracleDriver"; y=k!>Y|E
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -q")qNt.
uid = "system"; ig}H7U2q@
pwd = "manager"; _2Hehw
Class.forName(className); YX,xC-37y
Connection cn = DriverManager.getConnection(url,uid,pwd); pY"&=I79tb
2)用jndi(java的命名和目录服务)方式 &3~_9+
例子 ;]A:(HSZj
String jndi = "jdbc/db"; ^3
6oqe{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); hI}rW^o^
DataSource ds = (DataSource) ctx.lookup(jndi); Q!`
Connection cn = ds.getConnection(); [`/d$V!e
多用于jsp中 %;-r->
2、执行sql语句 L`@)*x)~R
1)用Statement来执行sql语句 71wtO
String sql; yGZsPQIaV
Statement sm = cn.createStatement(); /~6)Vt
sm.executeQuery(sql); // 执行数据查询语句(select) dkI(&/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ELa:yIl0
2)用PreparedStatement来执行sql语句 JM> 4m)h#
String sql; 7Pp~)Kq=
sql = "insert into user (id,name) values (?,?)"; b[;Zl<
PreparedStatement ps = cn.prepareStatement(sql); Bm:N@wg
ps.setInt(1,xxx); 'M=c-{f~
ps.setString(2,xxx); skzTw66W.
... mJFFst,
ResultSet rs = ps.executeQuery(); // 查询 1_RN*M+#
int c = ps.executeUpdate(); // 更新 ~z&Ho
D]B;5f
3、处理执行结果 |*te69RX
查询语句,返回记录集ResultSet 5
cz6\A&
更新语句,返回数字,表示该更新影响的记录数 -l i71.M
ResultSet的方法 3uJ>:,~r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false LPK[^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T.B}k`$
*R8qnvE\()
4、释放连接 I?#B_ R#
cn.close(); D FN
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection EhK~S(r^
FtmI\,
可滚动、更新的记录集 H;kk:s'
1、创建可滚动、更新的Statement {cMf_qQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Ua\<oD79]
该Statement取得的ResultSet就是可滚动的 0OF ]|hH
2、创建PreparedStatement时指定参数 y1*z,"dx
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GkYD:o=qx
ResultSet.absolute(9000); YM4njkI7
批量更新 Q~>="Yiu
1、Statement QbG`F8dj
Statement sm = cn.createStatement(); b_%W*Q
sm.addBatch(sql1); C=!YcJ9
sm.addBatch(sql2); |p"4cG?)
... n.tJ-l5[
sm.executeBatch() O9jpt>:kZ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 GJP\vsaQ
2、PreparedStatement b]XDfe
PreparedStatement ps = cn.preparedStatement(sql); D! $4
{ l.AG^b
ps.setXXX(1,xxx); i48Tb7Rx~n
... ~ s# !\Ye
ps.addBatch(); hJasnY7
} ` 8OA:4).
ps.executeBatch(); t}A n:
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F%F :Gr/
w?Nx^)xX
事务的处理 q@8j[15
1、关闭Connection的自动提交 Yt#e[CYnu
cn.setAutoCommit(false); ," ~4l&
2、执行一系列sql语句 !Q" 3B6
86
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +t`QHvxv
Statement sm ; wML5T+
sm = cn.createStatement(insert into user...); 1 6G/'Hb
sm.executeUpdate(); ?KF.v1w7
sm.close(); ]id5jVY
sm = cn.createStatement("insert into corp...); zyF[I6Gs
sm.executeUpdate(); *oP&'$P
sm.close(); &9,<_1~
3、提交 2}HS`) /
cn.commit(); o])2_e5
4、如果发生异常,那么回滚 F2k)hG*|{
cn.rollback();