java 数据库基本操作 -T_\f?V88
1、java数据库操作基本流程 $:vkX
2、几个常用的重要技巧: QZYU0;
VF
可滚动、更新的记录集 *Xr$/N
批量更新 zK5bO=0j
事务处理 .{so
1mW %
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oyeG$mpg
1、取得数据库连接 YD_]!HK}
1)用DriverManager取数据库连接 AFm1t2,+;
例子 < o I8-f
String className,url,uid,pwd; AXW!]=?X
className = "oracle.jdbc.driver.OracleDriver"; n Wgv~{,x
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7TWNB{
K_
uid = "system"; P]6}\
]~
pwd = "manager"; o$J6 ~dn
Class.forName(className); RUXCq`)"<
Connection cn = DriverManager.getConnection(url,uid,pwd); +x1/-J8_sg
2)用jndi(java的命名和目录服务)方式 N6/T#UVns
例子 8jnz}aBd
String jndi = "jdbc/db"; !1:@8q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); w]!0<
DataSource ds = (DataSource) ctx.lookup(jndi); %}qbkkZ
Connection cn = ds.getConnection(); 8l)
多用于jsp中 j6>tH"i
2、执行sql语句 %_f;G+fK\p
1)用Statement来执行sql语句 @.9I3E-=
String sql; `E>vG-9
Statement sm = cn.createStatement(); Ijo(^v@
sm.executeQuery(sql); // 执行数据查询语句(select) ")`S0n5e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q-&P=Yk
2)用PreparedStatement来执行sql语句 bhg}-dto
String sql; 2{o10eL
sql = "insert into user (id,name) values (?,?)"; zhsx&
PreparedStatement ps = cn.prepareStatement(sql); ok0X<MR!I
ps.setInt(1,xxx); |f' 8p8J
ps.setString(2,xxx); %a8&W
... #Z9L_gDp
ResultSet rs = ps.executeQuery(); // 查询 j\2[H^
int c = ps.executeUpdate(); // 更新 n["
9|
C{m&}g`
3、处理执行结果 Cvn$]bt/s
查询语句,返回记录集ResultSet IN !02`H
更新语句,返回数字,表示该更新影响的记录数 OyVm(%Z
ResultSet的方法 vrIV%l=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2*OxA%QELM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8z T0_vw
ElR)Gd_ 8
4、释放连接 km 5E)_]
cn.close(); ecFi(eMD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~@9zil41
>FFVY{F
可滚动、更新的记录集 )%j"
1、创建可滚动、更新的Statement /lH'hcXcX
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); pj|X]4?wdI
该Statement取得的ResultSet就是可滚动的 ;}4k{{K
2、创建PreparedStatement时指定参数 b! tludb
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); pXW`+<g0
ResultSet.absolute(9000); 8(lCi$
批量更新 A3yi?y{[*
1、Statement X47!E
|*
Statement sm = cn.createStatement(); rc{o?U'^-
sm.addBatch(sql1); =vEkMJOs
sm.addBatch(sql2); Zu#<
... Ay$>(;
sm.executeBatch() 80&D""
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 " $)yB
2、PreparedStatement lB:l)!]||=
PreparedStatement ps = cn.preparedStatement(sql); J(9=T<%T
{ p_6P`Yx^e
ps.setXXX(1,xxx); A*0*sZ0
... {ymb\$f
ps.addBatch(); r{ @ `o@q
} p":zrf'(6
ps.executeBatch(); U[fSQ`&D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 hyu}}0:
_*`q(dYcf
事务的处理 >q9{
1、关闭Connection的自动提交 W_JhNe
cn.setAutoCommit(false); z,+m[x=/N
2、执行一系列sql语句 FfYsSq2l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +by|
Statement sm ; !: |nI77|
sm = cn.createStatement(insert into user...); ` d`&R.'
sm.executeUpdate(); x[Q&k[xV
sm.close(); 2OC dG
sm = cn.createStatement("insert into corp...); RKe?.
sm.executeUpdate(); n\>.T[$"
sm.close(); V9{B}5KC
3、提交 t2.juoI(
cn.commit(); @ ;J|xkJ
4、如果发生异常,那么回滚 #313
(PWH
cn.rollback();