java 数据库基本操作 NrNxI'MG
1、java数据库操作基本流程 Cq<a|t
2、几个常用的重要技巧: t9!8Bh<
可滚动、更新的记录集 *h H\H
批量更新 +VN&kCx)
事务处理 &:}{?vU
&B;M.sz~C4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *k (|r>
1、取得数据库连接 L^7"I 4=(D
1)用DriverManager取数据库连接 \["'%8[:gR
例子 'f?=ks<
String className,url,uid,pwd; b!pG&7P
className = "oracle.jdbc.driver.OracleDriver"; /W vgC)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8
<~E;:
uid = "system"; )-RI
pwd = "manager"; ~zcHpxO^W
Class.forName(className); 4"=(kC~~
Connection cn = DriverManager.getConnection(url,uid,pwd); 6dzY9
2)用jndi(java的命名和目录服务)方式 #y?iUv
例子 'JjW5
String jndi = "jdbc/db"; sNF[-,a
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;(Xig$k
DataSource ds = (DataSource) ctx.lookup(jndi); hm&cRehU
Connection cn = ds.getConnection(); sK&[sN33
多用于jsp中 u=U.+\f5
2、执行sql语句 |$)+h\h
1)用Statement来执行sql语句 K).Gj2 $
String sql; LzS)WjEN
Statement sm = cn.createStatement(); [q%Rx!L
sm.executeQuery(sql); // 执行数据查询语句(select) l-} );zH74
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @_+B'<2
2)用PreparedStatement来执行sql语句 '/ >7pB
String sql; <6djdr1:b
sql = "insert into user (id,name) values (?,?)"; 8,l~e8 &
PreparedStatement ps = cn.prepareStatement(sql); !n?8'eqWru
ps.setInt(1,xxx); &F!Ct(c99
ps.setString(2,xxx); AMm)E
... uxKj7!(#
ResultSet rs = ps.executeQuery(); // 查询 6UXDIg=
int c = ps.executeUpdate(); // 更新 zj+.MG04
Ha}TdQ%
3、处理执行结果 8d!t"oj68
查询语句,返回记录集ResultSet da,Bnze0
更新语句,返回数字,表示该更新影响的记录数 -k+}w_<Q
ResultSet的方法 Ul/Uk n$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z|^+uL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 E76#xsyhF
Cd"cU~HAB
4、释放连接 6^'BhHP
cn.close(); { +$zgg
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &`9p.
lo!.%PP|
可滚动、更新的记录集 >[D(<b(U&
1、创建可滚动、更新的Statement V/8"@C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); DUAI
该Statement取得的ResultSet就是可滚动的 T08SGB]
2、创建PreparedStatement时指定参数 gZ^'hW-{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zo^34wW^
ResultSet.absolute(9000); p1blPBlp
批量更新 |@+/R .l
1、Statement V=?qU&r<+
Statement sm = cn.createStatement(); k v>rv37u
sm.addBatch(sql1); x e!([^l&
sm.addBatch(sql2); z"vI-~,YU
... ZSUbPz
sm.executeBatch() ?q%&"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [T<Z?
2、PreparedStatement He}uE0^
PreparedStatement ps = cn.preparedStatement(sql); G%RL8HU
{ &Se!AcvKF
ps.setXXX(1,xxx); ?4^8C4
... +IM:jrT(
ps.addBatch(); KbcmK(`_
} c=52*&
ps.executeBatch(); CH ojF+e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 I_k!'zR[N
'T7=.Hq<4
事务的处理 [ljC S
1、关闭Connection的自动提交 {wNNp't7
cn.setAutoCommit(false); 0<n*8t?A-
2、执行一系列sql语句 wt(Hk6/B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close hYI0S7{G
Statement sm ; 1e'Ez4*
sm = cn.createStatement(insert into user...); jk\04k
sm.executeUpdate(); :Nt_LsH
sm.close(); \mIm}+!H
sm = cn.createStatement("insert into corp...); L6ifT`;T
sm.executeUpdate(); ~:ldGfb|
sm.close(); *>#mI/#}
3、提交 T0Kjnzs
cn.commit(); naHQeX;
4、如果发生异常,那么回滚 EW:tb-%`
cn.rollback();