java 数据库基本操作 5%E.UjC
1、java数据库操作基本流程 M~1 n#
2、几个常用的重要技巧: D9|?1+Kc
可滚动、更新的记录集 N<54_(|X
批量更新 0Tm"Zh?B|
事务处理 ja2PmPv
-UM5&R+o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @9!,]n
1、取得数据库连接 !MiH^wP
1)用DriverManager取数据库连接 V\V:uo(C
例子 ]EzX$T
String className,url,uid,pwd; ?/,sKF74i
className = "oracle.jdbc.driver.OracleDriver"; (y xrK
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2-3|0<`
uid = "system"; z!={d1u#T
pwd = "manager"; u,6 'yB'u
Class.forName(className); h*qoe(+ZD
Connection cn = DriverManager.getConnection(url,uid,pwd); 'e(`2
2)用jndi(java的命名和目录服务)方式 {|jG_
例子 z mxrz[
String jndi = "jdbc/db"; !1H\*VM"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cO#e
AQf7
DataSource ds = (DataSource) ctx.lookup(jndi); v&>TU(x\H
Connection cn = ds.getConnection(); I&e,R
多用于jsp中 Q7]VB p4
2、执行sql语句 Q\DD^Pbq
1)用Statement来执行sql语句 kOfu7Zj
String sql; :z EhPx;B7
Statement sm = cn.createStatement(); `2Buf8|a,
sm.executeQuery(sql); // 执行数据查询语句(select) I\0mmdi73
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Us]Uy|j
2)用PreparedStatement来执行sql语句 cXO_g!&2A
String sql; c !ybz{L
sql = "insert into user (id,name) values (?,?)"; "/)}Cc,L
PreparedStatement ps = cn.prepareStatement(sql); 'S
f
ps.setInt(1,xxx); ZR3x;$I~4
ps.setString(2,xxx); #0HF7C3
... ,'CDKzY
ResultSet rs = ps.executeQuery(); // 查询 =~&Fq$$
int c = ps.executeUpdate(); // 更新 BW>f@;egg
4^L+LY
3、处理执行结果 (BgO<
查询语句,返回记录集ResultSet %EuXL% B
更新语句,返回数字,表示该更新影响的记录数 !Z7
~Rsdm
ResultSet的方法 *n)3y.s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "/).:9],}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9^m& [Z
4:=eO!6
4、释放连接 `nO!_3
cn.close(); S?}@2[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection RN?z)9!
iz`u@QKc%
可滚动、更新的记录集 a; Ihv#q
1、创建可滚动、更新的Statement 89B1\ff
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `'u|4pRFs
该Statement取得的ResultSet就是可滚动的 LDL#*g
2、创建PreparedStatement时指定参数 Kl[WscR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XV2f|8d>
ResultSet.absolute(9000); IkSzjXE{
批量更新 t/,k{5lX
1、Statement Cm;WQuv@
Statement sm = cn.createStatement(); 8KpG0DC
sm.addBatch(sql1); z,nRw/o
sm.addBatch(sql2); ~>@Dn40
... .Lrdw3(
sm.executeBatch() V*U7-{ *a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $cev,OW6]
2、PreparedStatement (U/xpj}
PreparedStatement ps = cn.preparedStatement(sql); DVYY1!j<
{ ]?L?q2>&
ps.setXXX(1,xxx); <3;/,>^ Pm
... HFwT
ps.addBatch(); V%pdXM5
} )gNHD?4x
ps.executeBatch(); V#W(c_g
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 TA=Ij,z~
S:] w@$
事务的处理 nMcd(&`N
1、关闭Connection的自动提交 EIl _QV6
cn.setAutoCommit(false); a%f5dj+
2、执行一系列sql语句 m=2TzLVv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /^v4[]
Statement sm ; }k}5\%#li5
sm = cn.createStatement(insert into user...); J4te!,
sm.executeUpdate(); 8zz-jkR
sm.close(); 0Bn$C,-
sm = cn.createStatement("insert into corp...); MB\vgKY
sm.executeUpdate(); :Ke~b_$Uy-
sm.close(); xH\'gli/
3、提交 \O?#gW\tR
cn.commit(); kX{c+qHM
4、如果发生异常,那么回滚 tkWWR%c"
cn.rollback();