java 数据库基本操作 ; $i{>mDT
1、java数据库操作基本流程 ^KM' O8
2、几个常用的重要技巧: &7VN?ox1
可滚动、更新的记录集 |A0BYzlVc
批量更新 >7V96jL$Y
事务处理 ^Vso`(Ss
!KKkw4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M%92^;|`
1、取得数据库连接 #^|y0:
1)用DriverManager取数据库连接 NjrF":'Y
例子 @n"7L2wY
String className,url,uid,pwd; m9 o{y6_j*
className = "oracle.jdbc.driver.OracleDriver"; %JF^@\E!|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; p.A_,iE
uid = "system"; `*g(_EZsS
pwd = "manager"; 6!*be|<&
Class.forName(className); 7jL+c~
Connection cn = DriverManager.getConnection(url,uid,pwd); ePv3M&\J
2)用jndi(java的命名和目录服务)方式 WXV (R,*Tc
例子 sEkfmB2J/
String jndi = "jdbc/db"; %IL]
Wz<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aMe]6cWHV>
DataSource ds = (DataSource) ctx.lookup(jndi); w$[&ejFb
Connection cn = ds.getConnection(); qIS9.AL
多用于jsp中 !}[}YY?',i
2、执行sql语句 rofj&{w
1)用Statement来执行sql语句 `u$
Rd
String sql; H=RzY-\a%
Statement sm = cn.createStatement(); X'Q?Mh
sm.executeQuery(sql); // 执行数据查询语句(select) ]Wr2I M
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z}#'.y\ f
2)用PreparedStatement来执行sql语句 %A64AJZ
String sql; KSDz3qe
sql = "insert into user (id,name) values (?,?)"; b+Sq[
PreparedStatement ps = cn.prepareStatement(sql); `?E|frz[
ps.setInt(1,xxx); `?f6~$1
ps.setString(2,xxx); +O"!*
... )O\w'|$G
ResultSet rs = ps.executeQuery(); // 查询 10R#}~D
int c = ps.executeUpdate(); // 更新 .);~H#
ndg1E;>
3、处理执行结果 S52'!WTq
查询语句,返回记录集ResultSet VzD LG LH
更新语句,返回数字,表示该更新影响的记录数 J_NY:B
ResultSet的方法 H1>~,zc>E
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {*mf Is
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7+
+Fak
K</EVt,U~
4、释放连接 #NQpr
cn.close(); ]8@s+N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &n$kVNE
Iue}AGxu:{
可滚动、更新的记录集 nilis-Bk_
1、创建可滚动、更新的Statement !iv6k~.e'2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kZ<0|b
该Statement取得的ResultSet就是可滚动的
IR JN
2、创建PreparedStatement时指定参数 la4
#2>#WZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); PWci D '!
ResultSet.absolute(9000); 6`Hd)T5{w
批量更新 @=_4i&]$
1、Statement I;1W6uD=
Statement sm = cn.createStatement(); |BGB60}]f
sm.addBatch(sql1); |"}oGL6-
sm.addBatch(sql2); Ey|{yUmU+
... &3gC&b^i
sm.executeBatch() 4g4[n7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _D+pJ{@W
2、PreparedStatement gy5 ^JL
PreparedStatement ps = cn.preparedStatement(sql); GmhfBW?
{ de=){.7Y
ps.setXXX(1,xxx); f/xQy}4+~E
... ~:FF"T>
ps.addBatch(); xVxN
@[
} s.|OdC>U =
ps.executeBatch(); ly[j=vBV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^_\S)P2c
=hRo#]{(K
事务的处理 %_Q+@9
1、关闭Connection的自动提交 [}$jO,H5r
cn.setAutoCommit(false); tJBj9{
2、执行一系列sql语句 ^?M# |>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )[b\wrc
Statement sm ; :2t0//@X
sm = cn.createStatement(insert into user...); { 9:vq|
sm.executeUpdate(); <+y%k~("
sm.close(); "m#17J_
sm = cn.createStatement("insert into corp...); K_!R
sm.executeUpdate(); 0<i8
;2KD
sm.close(); i?wEd!=w
3、提交 T.(C`/VM
cn.commit(); '\B0#z3
4、如果发生异常,那么回滚 r4 $<,~
cn.rollback();