java 数据库基本操作 !oa/\p
1、java数据库操作基本流程 5=#2@qp
2、几个常用的重要技巧: .*edaDi
可滚动、更新的记录集 +ib&6IU
批量更新 (q@%eor&}
事务处理 hg2Ywzfm-
[}HS[($
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ik#ti=.
1、取得数据库连接 H'+3<t>
1)用DriverManager取数据库连接 !dq$qUl/
例子 *ze,X~8-
String className,url,uid,pwd; V|G*9^Y
className = "oracle.jdbc.driver.OracleDriver"; Re+oCJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~BiLzT1,
uid = "system"; xXlx}C
pwd = "manager"; `S+n,,l
Class.forName(className); U(gYx@
Connection cn = DriverManager.getConnection(url,uid,pwd); (mplo|>
2)用jndi(java的命名和目录服务)方式 ~O~iP8T
例子 EW`3$J;
String jndi = "jdbc/db"; }
m"':f
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .k$Yleg
DataSource ds = (DataSource) ctx.lookup(jndi); xR8y"CpE
Connection cn = ds.getConnection(); ~ mz X1[
多用于jsp中 =h xyR;
2、执行sql语句 #jJ0Mxg
1)用Statement来执行sql语句 ZUD{V
String sql; Oy b0t|do+
Statement sm = cn.createStatement(); =ld!=II
sm.executeQuery(sql); // 执行数据查询语句(select) $_3)m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6"?#E[ #[
2)用PreparedStatement来执行sql语句 !jf!\Uu[U
String sql; g&{CEfw&
sql = "insert into user (id,name) values (?,?)"; SAiaC _
PreparedStatement ps = cn.prepareStatement(sql); V qcw2
ps.setInt(1,xxx); *mH&Gn1
ps.setString(2,xxx); ,Wtgj=1!.
... pedyWA>
ResultSet rs = ps.executeQuery(); // 查询 lL'Bop@
int c = ps.executeUpdate(); // 更新 qI>,PX
yuC|_nL
3、处理执行结果 k!bG![Ie|
查询语句,返回记录集ResultSet
\u04m}h]
更新语句,返回数字,表示该更新影响的记录数 %k<+#j6ZH
ResultSet的方法 39MOqVc
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5g.w"0MkY
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 qHgzgS7a
Kn1T2WSAg
4、释放连接 `6RccEm
cn.close(); \r9E6LLX'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection X#Ob^E%J
Qsw.429t
可滚动、更新的记录集 V CVKh
1、创建可滚动、更新的Statement LcT;7yv
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Khl0 ~
该Statement取得的ResultSet就是可滚动的
1/,~0N9
2、创建PreparedStatement时指定参数 L)8%*X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U_hzSf
ResultSet.absolute(9000); J\>/J%
批量更新 F("|SOhc
1、Statement
AQ0zsy
Statement sm = cn.createStatement(); =J"c'Z>.
sm.addBatch(sql1); zK I1
sm.addBatch(sql2); n1aOpz6`
... p"7[heExw
sm.executeBatch() P,b&F
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _8ks`O#}
2、PreparedStatement nN^lY=3
PreparedStatement ps = cn.preparedStatement(sql); <2fy(9y
{ =**Q\Sl
ps.setXXX(1,xxx); %%#bTyF
... <Ql2+ev6
ps.addBatch(); 24
.'+3
} GvvKM=1
ps.executeBatch(); 9-vQn/O^D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 u{w,y.l1h
0x<G\ l4
事务的处理 Q5l+-
1、关闭Connection的自动提交 %eh.@8GL`
cn.setAutoCommit(false); ]826k pq_
2、执行一系列sql语句 y2mSPLw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close F>5b[q6~4
Statement sm ; g[HuIn/
sm = cn.createStatement(insert into user...); aK]AhOG
sm.executeUpdate(); sl"H!cwF
sm.close(); tK?XU9o
sm = cn.createStatement("insert into corp...); 7G7"Zule*j
sm.executeUpdate(); pe>?m ^gz[
sm.close(); Jw>na _FJ
3、提交 2kk; z0f
cn.commit(); A`Rs
n\
4、如果发生异常,那么回滚 F\v~2/J5v
cn.rollback();