java 数据库基本操作 \(s";@
1、java数据库操作基本流程 {0~ p" %*
2、几个常用的重要技巧: # jyAq$I0
可滚动、更新的记录集 6C=.8eP
批量更新 nfEk ,(:
事务处理 xae7#d0
o@-cT`HP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 V"z0]DP5~
1、取得数据库连接 9lwg`UWl,
1)用DriverManager取数据库连接 }#@LZ)]hK
例子 ]cK@nq)
String className,url,uid,pwd; #:X:~T
className = "oracle.jdbc.driver.OracleDriver"; <U";V)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 16U@o>O
uid = "system"; %\u>%s<9
pwd = "manager"; x4(WvQ%O#
Class.forName(className); *%.*vPJ
Connection cn = DriverManager.getConnection(url,uid,pwd); \ U_DTI
2)用jndi(java的命名和目录服务)方式 iW)Ou?aS
例子 .T2I]d
String jndi = "jdbc/db"; \hVFK6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~V5jjx*
DataSource ds = (DataSource) ctx.lookup(jndi); ;F-kE4w
Connection cn = ds.getConnection(); s5 BV8 M
多用于jsp中 {$JIR}4S
2、执行sql语句 }0o0 "J-$
1)用Statement来执行sql语句 NoT oLt\
String sql; %$Uw]a
Statement sm = cn.createStatement(); 'DPSM?]fA
sm.executeQuery(sql); // 执行数据查询语句(select) F~6[DqF\|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); C\Rd]P8\
2)用PreparedStatement来执行sql语句 idQr^{
String sql; +=QboUN
sql = "insert into user (id,name) values (?,?)"; u&:jQ:[
PreparedStatement ps = cn.prepareStatement(sql); }_S]!AWz
ps.setInt(1,xxx); E^G=
ps.setString(2,xxx); : s35{K
... &^"m6
ResultSet rs = ps.executeQuery(); // 查询 Y\\&~g42R2
int c = ps.executeUpdate(); // 更新 k 'o?/
`Bx CTwc
3、处理执行结果 lnhZ!_
查询语句,返回记录集ResultSet \4DH&gZ[
更新语句,返回数字,表示该更新影响的记录数 kK(,FB
ResultSet的方法 l?d*g&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xK f+.6 wz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 gw-l]@;1
mi+I)b=
4、释放连接 sSxra!tv4
cn.close(); vKxwv
YDe
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection GauIe0qV
( Qnn
可滚动、更新的记录集 BQ(`MM@
1、创建可滚动、更新的Statement v "07H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #F
kdcY
该Statement取得的ResultSet就是可滚动的 UaB!,vs3st
2、创建PreparedStatement时指定参数 aO{k-44y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'k hJZ:
ResultSet.absolute(9000); d+kIof,
批量更新 is,_r(S
1、Statement X#fI$9a
Statement sm = cn.createStatement(); Cs< d\"+
sm.addBatch(sql1); $Khc?v
sm.addBatch(sql2); t_3XqjuA
... P<U{jkM\/
sm.executeBatch() "{}5uth
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2Ig.hnHj
2、PreparedStatement }\B6d\k
PreparedStatement ps = cn.preparedStatement(sql); BX?Si1c
{ z>!b
ps.setXXX(1,xxx); gC?k6)p$N
... @uHNz-c
ps.addBatch(); /Bc
;)~
} K=;p^dE
ps.executeBatch(); S;=
D/)[mr
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6<2 7}S
AO/R2a(:
事务的处理 +%0+
1、关闭Connection的自动提交 k;]&`c^5
cn.setAutoCommit(false); 0@>3fR
2、执行一系列sql语句 9d
v+u6)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Pp?J5HW
Statement sm ; ,JR7N_"I
sm = cn.createStatement(insert into user...); B<W{kEY
sm.executeUpdate(); yZKj>P1
sm.close(); 3a =KgOvp
sm = cn.createStatement("insert into corp...); ^z_~e@U
sm.executeUpdate(); D(y=0),
sm.close(); [/I4Pe1Yj%
3、提交 <)&;9C
cn.commit(); 3K{'~?mM
4、如果发生异常,那么回滚 3]T2Zp&;
cn.rollback();