java 数据库基本操作 hFjXgpz5
1、java数据库操作基本流程 ;U|^Tsuc`
2、几个常用的重要技巧: X=p~`Ar M{
可滚动、更新的记录集 zAxwM-`
批量更新 q#RVi8('
事务处理 WqC6c&NM
}hFjl4`xa
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 E5M*Gs
1、取得数据库连接 ZC1U
1)用DriverManager取数据库连接 iM Xl}3
例子 nV0"q|0K;
String className,url,uid,pwd; B94mh
className = "oracle.jdbc.driver.OracleDriver"; ;Db89Nc$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; uj-q@IKe
uid = "system"; -hP@L ++D
pwd = "manager"; [D H@>:"dd
Class.forName(className); {O,Cc$_
Connection cn = DriverManager.getConnection(url,uid,pwd); ]AGJPuX
2)用jndi(java的命名和目录服务)方式 d*lnXzQor
例子 <oSk!6*
String jndi = "jdbc/db"; .Wq`qF(;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qu[x=LZ_
DataSource ds = (DataSource) ctx.lookup(jndi); ,diV;d
Connection cn = ds.getConnection(); U jC$Mi`O
多用于jsp中 BV&}(9z
2、执行sql语句 LTY@}o]\U
1)用Statement来执行sql语句 >Tld:
String sql; 0=8.8LnN(
Statement sm = cn.createStatement(); V\kf6E
sm.executeQuery(sql); // 执行数据查询语句(select) qb
^4G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); v5t`?+e
2)用PreparedStatement来执行sql语句 5|-(Ic
String sql; G2k r~FG
sql = "insert into user (id,name) values (?,?)"; $2^V#GWo
PreparedStatement ps = cn.prepareStatement(sql); *Df|D/,WE
ps.setInt(1,xxx); (0qdU;
ps.setString(2,xxx); i)0*J?l=
... 'PlKCn`(w
ResultSet rs = ps.executeQuery(); // 查询 IjDG
int c = ps.executeUpdate(); // 更新 ~`{HWmah
fwI Zr~l
3、处理执行结果 U3^T.i"R
查询语句,返回记录集ResultSet +MQf2|--
更新语句,返回数字,表示该更新影响的记录数 A;h0BQm/j
ResultSet的方法 XQk9 U
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0X)'8N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %+G/oF|
hSD)|
4、释放连接 {
Lt\4h
cn.close(); 1C=}4^Pu
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection L`+\M+
E<a~
`e
可滚动、更新的记录集 KTk%Np
1、创建可滚动、更新的Statement =? x A*_^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); B{|P}fN5}
该Statement取得的ResultSet就是可滚动的 =?57*=]0M
2、创建PreparedStatement时指定参数 _-Aw`<_*-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); fZXJPy;n
ResultSet.absolute(9000); 5-w6(uu
批量更新 5Lt&P
5BY
1、Statement 9r7QE&.
Statement sm = cn.createStatement(); D|Z,eench
sm.addBatch(sql1); vdNh25a<h
sm.addBatch(sql2); @-;-DB]j
... Xig+[2zS
sm.executeBatch() 7BF't!-2F
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^$_a_ft#
2、PreparedStatement e9q/[xMi
PreparedStatement ps = cn.preparedStatement(sql); iYv6B6o/99
{ P7E}^y`e
ps.setXXX(1,xxx); [(`T*c.#.X
... d?&?$qf[
ps.addBatch(); q!<`ci,uS
} ^?toTU
ps.executeBatch(); 1(!QutEb
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 KL0u:I(lWU
@dJ
s
事务的处理 @^;WC+\0
1、关闭Connection的自动提交 %I%F
!M
cn.setAutoCommit(false); ZH`6>:
2、执行一系列sql语句 (1(3:)@S6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Os8]iNvW\
Statement sm ; 8R:H{)o~s}
sm = cn.createStatement(insert into user...); !HqIi@>8
sm.executeUpdate(); ,US~p_M!
sm.close(); "~7| !9<
sm = cn.createStatement("insert into corp...); *=S\jek
sm.executeUpdate(); VPn#O
sm.close(); K~@-*8%
3、提交 ,vW.vq<{q3
cn.commit(); *D,+v!wG9
4、如果发生异常,那么回滚 ; ZL<7tLDb
cn.rollback();