java 数据库基本操作 tX{yR'Qhu
1、java数据库操作基本流程 "tzu.V-
2、几个常用的重要技巧: vA1YyaB
可滚动、更新的记录集 o eUi
批量更新 go uU
事务处理 >%j%Mj@8q|
>1Z"5F7=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'rcqy1-&
1、取得数据库连接 v3I^81
1)用DriverManager取数据库连接 ,yYcjs!=o
例子 4N,mcV
String className,url,uid,pwd; r!mRUw'u
className = "oracle.jdbc.driver.OracleDriver"; ?l0Qi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; YA4 D?'
uid = "system"; *j%x
pwd = "manager"; '+PKGmRW
Class.forName(className); `<C<[JP:o
Connection cn = DriverManager.getConnection(url,uid,pwd); 9{toPED
2)用jndi(java的命名和目录服务)方式 6Yj{%
G
例子 lM6pYYEq=
String jndi = "jdbc/db"; Gmz^vpQ]t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ai{>rO3 }I
DataSource ds = (DataSource) ctx.lookup(jndi); l#'V
SFm&
Connection cn = ds.getConnection(); to'7o8Z
多用于jsp中 #Vq9 =Q2
2、执行sql语句 :aesG7=O
1)用Statement来执行sql语句 0ns\:2)cEB
String sql; }Y~Dk]*
Statement sm = cn.createStatement(); Lnr9*dm6q
sm.executeQuery(sql); // 执行数据查询语句(select) Iux3f+H
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J7`mEL>?
2)用PreparedStatement来执行sql语句 +xFn~b/
String sql; *;o%*:
sql = "insert into user (id,name) values (?,?)"; $.SBW=^V
PreparedStatement ps = cn.prepareStatement(sql); e5|lz.o;
ps.setInt(1,xxx); .-KI,IU
ps.setString(2,xxx); $5R2QNg n
... Y}:~6`-jj
ResultSet rs = ps.executeQuery(); // 查询 k{}> *pCU
int c = ps.executeUpdate(); // 更新 gxv^=;2C
pM?;QG;jA
3、处理执行结果 JE?rp1.
查询语句,返回记录集ResultSet 3e_tT8
更新语句,返回数字,表示该更新影响的记录数 q<JCgO-F<
ResultSet的方法 $TI^8 3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false i+Z)`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O$,Fga
7*!7EBb
4、释放连接 95l)s],
cn.close(); u\]EG{w(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uE-(^u
4ax{Chn
可滚动、更新的记录集 ~KBa-i%o
1、创建可滚动、更新的Statement T6U/}&{O
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); zJe KB8
该Statement取得的ResultSet就是可滚动的 oP&/>GmXL
2、创建PreparedStatement时指定参数 UVo`jb|>
o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); aSzI5J]/=
ResultSet.absolute(9000); `q^#u
批量更新 2Y
vr|] \8
1、Statement ge~@}iO@
Statement sm = cn.createStatement(); f[@96p?a[
sm.addBatch(sql1); v"USD<
sm.addBatch(sql2); )9]a
... ".?4`@7F\
sm.executeBatch() [C'bfX5HB5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 n|( lPbD
2、PreparedStatement p5G'})x
PreparedStatement ps = cn.preparedStatement(sql); b6D;98p
{ QJ|@Y(KV0
ps.setXXX(1,xxx); Ipp_}tl_
... H+v&4} f
ps.addBatch(); &."$kfA+
} sh<Q2X
ps.executeBatch(); IPQRdBQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 mq`/nAmt
6_CP?X+T
事务的处理 Npp YUY
1、关闭Connection的自动提交 ov6xa*'a
cn.setAutoCommit(false); 4Yj1Etq.E
2、执行一系列sql语句 pRd.KY -<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dljE.peL
Statement sm ; 3_(_yEKx
sm = cn.createStatement(insert into user...); qE[S>/R"
sm.executeUpdate();
,"v&r(
sm.close(); cU1o$NRx
sm = cn.createStatement("insert into corp...); LP2~UVq
sm.executeUpdate(); [h/T IGE\
sm.close(); ;Shu
3、提交 l A ^1}
cn.commit(); b9bIvjm_
4、如果发生异常,那么回滚 M5dYcCDE
cn.rollback();