java 数据库基本操作 CSc*UX+
1、java数据库操作基本流程 :tdx:
2、几个常用的重要技巧: ' F`*(\#
可滚动、更新的记录集 ixBM>mRK
批量更新 jp8=>mk
事务处理 0-0 )E&2
E{T\51V]%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _|DP
1、取得数据库连接 2P$l XGjh
1)用DriverManager取数据库连接 #1hT#YN
例子 i0-!!
String className,url,uid,pwd; vbqI$F[s
className = "oracle.jdbc.driver.OracleDriver"; u>&\@?(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 78+H|bH8
uid = "system"; 1?(BWX)7
pwd = "manager"; @EfCNOy
Class.forName(className); &-<"HW
Connection cn = DriverManager.getConnection(url,uid,pwd); <ofXNv;`
2)用jndi(java的命名和目录服务)方式 huvg'Yt
例子 J}jK_
String jndi = "jdbc/db"; \2_>$:UoV
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); dadOjl)S)
DataSource ds = (DataSource) ctx.lookup(jndi); t8i"f L
Connection cn = ds.getConnection(); oCy52Bm.!
多用于jsp中 (n" )
2、执行sql语句 P|h<|Gcp
1)用Statement来执行sql语句 bIp;$ZHy`K
String sql; hp-<8Mf
Statement sm = cn.createStatement(); >-X&/i
sm.executeQuery(sql); // 执行数据查询语句(select) bcM#KA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^l$(- #'y
2)用PreparedStatement来执行sql语句 H7Y}qP5X
String sql; !Q.c8GRUQ
sql = "insert into user (id,name) values (?,?)"; EyBdL
PreparedStatement ps = cn.prepareStatement(sql); d.2b7q09
ps.setInt(1,xxx); ,9?'Q;20
ps.setString(2,xxx); *N>Qj-KAM_
... <ya'L&
ResultSet rs = ps.executeQuery(); // 查询 d[~c-G6
int c = ps.executeUpdate(); // 更新 /2FX"I[0V%
<(f4#BP
3、处理执行结果 u`bWn
查询语句,返回记录集ResultSet 7]nPWz1%*
更新语句,返回数字,表示该更新影响的记录数 @b>]q$)(}
ResultSet的方法 %i.|bIhmm
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "*7I~.7U(*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 XX6&%7(
LL[+QcH
4、释放连接 ]ei])
JI
cn.close(); Lvp/} /H/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^k_!+8"q{
R
+\y".
可滚动、更新的记录集 qS2%U?S7
1、创建可滚动、更新的Statement I?fE=2}9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kBONP^xI
该Statement取得的ResultSet就是可滚动的 }s)Z:6;(,q
2、创建PreparedStatement时指定参数 #e|eWi>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); D>|:f-Z6Z
ResultSet.absolute(9000); s]I],>}RU
批量更新 AoR`/tr,
1、Statement "q(&<+D@
Statement sm = cn.createStatement(); JfVayI=
sm.addBatch(sql1); 0)P18n"$
sm.addBatch(sql2); *,Re&N8
... #ERn 8k
sm.executeBatch() {[s<\<~B*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 t{7l.>kf
2、PreparedStatement #E ~FF@a
PreparedStatement ps = cn.preparedStatement(sql); Kz<xu ulr
{ eT|_0kx1
ps.setXXX(1,xxx); 9:Y:Vx
... g@U#Y#b@"
ps.addBatch(); A]J^{h0k
} {10ms_s
ps.executeBatch(); s{IoL_PJP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?UxY4m%R;
-?]ltn9!
事务的处理 UP`q6]P
1、关闭Connection的自动提交 ]SPB c
cn.setAutoCommit(false); \8$`:3,@
2、执行一系列sql语句 c[YjGx
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 68!]q(!6F
Statement sm ; wiGwN
sm = cn.createStatement(insert into user...); .( J/*H
sm.executeUpdate(); q1gf9`0
sm.close(); |HEw~x<=
sm = cn.createStatement("insert into corp...); aE%VH ;?
sm.executeUpdate(); q)~qd$yMS
sm.close();
U<t-LF3
3、提交 D=\|teA&
cn.commit(); "h2Ny#
4、如果发生异常,那么回滚 ,YY#ed&l
cn.rollback();