java 数据库基本操作 yV`!Fq 1k
1、java数据库操作基本流程 \kg2pF[V
2、几个常用的重要技巧: QDgOprha
可滚动、更新的记录集 _`;6'}]s
批量更新 QY{f=
事务处理 b [u_r,b
?j $z[_K
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,q:6[~n
1、取得数据库连接 "3\)@
1)用DriverManager取数据库连接 'x!q*|zF2
例子 y2<g96
String className,url,uid,pwd; b%v1]a[
className = "oracle.jdbc.driver.OracleDriver"; Yq2mVo
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XKR?vr7A2
uid = "system"; jh=:Q P/
pwd = "manager"; qed;
UyN
Class.forName(className); =Qz8"rt#
Connection cn = DriverManager.getConnection(url,uid,pwd); zlXkD~GV
2)用jndi(java的命名和目录服务)方式 ]Mtb~^joG
例子 t[^}/
S
String jndi = "jdbc/db"; YjsaTdZ!&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _@d.wfM
DataSource ds = (DataSource) ctx.lookup(jndi); ;vd%=vR
Connection cn = ds.getConnection(); @9QHv
多用于jsp中 0<o#;ZQ]
2、执行sql语句 1`h`-dqr#
1)用Statement来执行sql语句 OCRx|
String sql; KK7Y"~ 9&-
Statement sm = cn.createStatement(); o+q5:vJt
sm.executeQuery(sql); // 执行数据查询语句(select) <xc"y|7X
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); qWP1i7]=/
2)用PreparedStatement来执行sql语句 Y$'fds4P
String sql; sG^b_3o)A
sql = "insert into user (id,name) values (?,?)"; 6?hv,^
PreparedStatement ps = cn.prepareStatement(sql);
Q.cxen
ps.setInt(1,xxx); blS*HKw
ps.setString(2,xxx); `;i|
%$TU
... hz )L+
ResultSet rs = ps.executeQuery(); // 查询 1{u;-pg
int c = ps.executeUpdate(); // 更新 qOk4qbl[
2{&|%1Jg
3、处理执行结果 IG#=}q
查询语句,返回记录集ResultSet E=7"};
更新语句,返回数字,表示该更新影响的记录数 P=S)V
ResultSet的方法 ~){*XJw6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g3Ff<P P
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 /n:s9eq
> m5j.GP;
4、释放连接 M/B_-8B_D
cn.close(); D0-C:gz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q}]Q0'X8
=3& WH0
可滚动、更新的记录集 G19FSLrtA
1、创建可滚动、更新的Statement _c%~\LOk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &jg,8
该Statement取得的ResultSet就是可滚动的 *h]qh20t
2、创建PreparedStatement时指定参数 /e\}
qq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3`="4
ResultSet.absolute(9000); g]d@X_ &D
批量更新 Y`c\{&M6
1、Statement =0 m[
Statement sm = cn.createStatement(); o_={xrmIA
sm.addBatch(sql1); i?mDR$X:
sm.addBatch(sql2); 6 !+"7r6
... ZtB0:'o;
sm.executeBatch() '6K WobXm
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 na/t=<{
2、PreparedStatement -h.']^I
PreparedStatement ps = cn.preparedStatement(sql); =Ybbh`$<
{ |w\D6d]o
ps.setXXX(1,xxx); )Oa"B;\j
... ?(ks=rRK
ps.addBatch(); CZ1tqAk-
} uwf3
ps.executeBatch(); Te5_T&1Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 GO`XKE
#%+IU
事务的处理 9]hc{\
1、关闭Connection的自动提交 #H5*]"w6I
cn.setAutoCommit(false); c) 1m4SB@
2、执行一系列sql语句 ! 4i
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :Z`4ea"w
Statement sm ; y.mojx%?a
sm = cn.createStatement(insert into user...); %f,
9
sm.executeUpdate(); cZ o]*Gv.
sm.close(); ts)0+x
sm = cn.createStatement("insert into corp...); e6{/e+/R
sm.executeUpdate(); VsUEp_I
sm.close(); '!En,*'IS
3、提交 "jAV7lP
cn.commit(); 7E|0'PPR
4、如果发生异常,那么回滚 (&X"~:nm2
cn.rollback();