java 数据库基本操作 71GyMtX
1、java数据库操作基本流程 5!pof\/a
2、几个常用的重要技巧: HpX ;:/I
可滚动、更新的记录集 ~Os1ir.
批量更新 ^[]@dk9
事务处理 9AgTrP
v.Y?<=E+<d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Jiv%Opo/|
1、取得数据库连接 )=vQrMyB
1)用DriverManager取数据库连接 wcI?.
例子 i6@c@n
String className,url,uid,pwd; E1&9( L5
className = "oracle.jdbc.driver.OracleDriver"; 25zmde~ w
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sOY+X
uid = "system"; [$<\*d/
pwd = "manager"; ]?#E5(V@x
Class.forName(className); 4|#@41\ B
Connection cn = DriverManager.getConnection(url,uid,pwd); =5v=<, ]
2)用jndi(java的命名和目录服务)方式 Hido[
例子 Zr%,F[j?
String jndi = "jdbc/db"; $xK2M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _,?<r&>v6
DataSource ds = (DataSource) ctx.lookup(jndi); 3m#/1=@o
Connection cn = ds.getConnection(); \pVmSac,
多用于jsp中 KDX1_r=Y
2、执行sql语句 m/T3Um
1)用Statement来执行sql语句 (1pR=
String sql; nbMxQODk
Statement sm = cn.createStatement(); Ddr.kXIpo
sm.executeQuery(sql); // 执行数据查询语句(select) +'lj\_n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y_7lSo8<
2)用PreparedStatement来执行sql语句 KS3>c7
String sql; PXRkK63
sql = "insert into user (id,name) values (?,?)"; 5(+PIKCjC
PreparedStatement ps = cn.prepareStatement(sql); T.}wcQf&*
ps.setInt(1,xxx); Wz%b,!
ps.setString(2,xxx); ~fV\
X*
... dx&!RK+
ResultSet rs = ps.executeQuery(); // 查询 T{"[Ih3Mbl
int c = ps.executeUpdate(); // 更新 `Q@w*ta)
g"dq;H
3、处理执行结果 WEnI[JGe
查询语句,返回记录集ResultSet b:M1P&R
更新语句,返回数字,表示该更新影响的记录数 v/m} {&K
ResultSet的方法 1z6$>{FUR
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QCD
MRh n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S <RbC
O?=YY@j
4、释放连接 (\8~W*ej"
cn.close(); @|2L>N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [XKudw%
+QZ}c@'r
可滚动、更新的记录集 W0 n?S
"
1、创建可滚动、更新的Statement ,l47;@kr
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); VL?sfG0
该Statement取得的ResultSet就是可滚动的 .DX-biX,
2、创建PreparedStatement时指定参数 k Xg&}n7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s;ivoGe}
ResultSet.absolute(9000); =.48^$LWx
批量更新 E-`3}"{
1、Statement CQANex4&\
Statement sm = cn.createStatement(); VRs|";
sm.addBatch(sql1);
=]
+owl2
sm.addBatch(sql2); iCtDV5
... 3-PqUJT$
sm.executeBatch() V"Sa9P{y"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z%Eok
2、PreparedStatement EEn8]qJC
PreparedStatement ps = cn.preparedStatement(sql); `w_%HVw>"
{ nf0]<x2
ps.setXXX(1,xxx); DuMzK%
...
W<@9ndvH
ps.addBatch(); +Zg@X.z
} E Xxv
ps.executeBatch(); 'nT#c[x[0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Xmm)z
! }>CEE
事务的处理 Ab
In\,x
1、关闭Connection的自动提交 a_3w/9L4r
cn.setAutoCommit(false); Q3I^(Ll"L
2、执行一系列sql语句 sxn{uRF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *6bO2LO"
Statement sm ; .nzN5FB
U
sm = cn.createStatement(insert into user...); +WjX@rSq[
sm.executeUpdate(); Fy$f`w_H@
sm.close(); |JLXgwML
sm = cn.createStatement("insert into corp...); >i_ #q$o
sm.executeUpdate(); &\y`9QpVF
sm.close(); ]SmN}Iq1
3、提交 agkGUK/
cn.commit(); i*((@:
4、如果发生异常,那么回滚 ]Zz.n5c
cn.rollback();