java 数据库基本操作 adi^*7Q] )
1、java数据库操作基本流程 d7g3VF<j
2、几个常用的重要技巧: B,2oA]W"S
可滚动、更新的记录集 H1!u1k1nl
批量更新 75>)1H)Xm
事务处理 /'
+GYS
U|[+M@F_L
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &OK[n1M
1、取得数据库连接 OrN~ Y#D
1)用DriverManager取数据库连接 V:<NQd
例子 6[\b]I\Q
String className,url,uid,pwd; Xs,[Z2_iq
className = "oracle.jdbc.driver.OracleDriver"; {x&"b -
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >gj%q$@
uid = "system"; AeQIsrAHE
pwd = "manager"; Ptj,9bf<\
Class.forName(className); S"}G/lBx.
Connection cn = DriverManager.getConnection(url,uid,pwd); @ V_@r@A
2)用jndi(java的命名和目录服务)方式 E~[v.3`
例子 M1>2Q[h7
String jndi = "jdbc/db"; z8MKGM
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2 q4dCbJ!
DataSource ds = (DataSource) ctx.lookup(jndi); erhxZ|."P
Connection cn = ds.getConnection(); P~6QRm
多用于jsp中 khXp}p!Zm
2、执行sql语句 =N,ahq
1)用Statement来执行sql语句 aPELAU-
String sql; ceKR?%8 s
Statement sm = cn.createStatement(); ~~8?|@V
sm.executeQuery(sql); // 执行数据查询语句(select) p3e_:5k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); n ]K`ofjl^
2)用PreparedStatement来执行sql语句 \J)ffEKIp
String sql; A2C|YmHk
sql = "insert into user (id,name) values (?,?)"; }DCR(p rD
PreparedStatement ps = cn.prepareStatement(sql); $e99[y@
ps.setInt(1,xxx); m VSaC
ps.setString(2,xxx); Or({|S9d2
... {? a@UUvC
ResultSet rs = ps.executeQuery(); // 查询 @bkZ< Gq
int c = ps.executeUpdate(); // 更新 %.NOQ<@W
ITUwIpAE
3、处理执行结果 :)djHPP*
查询语句,返回记录集ResultSet /,tQdD&
更新语句,返回数字,表示该更新影响的记录数 ('9LUFw\
ResultSet的方法 7 3 Oo;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E/<5JhI9~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :o2^?k8k
bVLuv`A/
4、释放连接 ~|FKl%
cn.close(); K3CTxU(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection dg(fD>+
"OdR"M(G\
可滚动、更新的记录集 H#Aar
1、创建可滚动、更新的Statement l^LYSZg'R8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); QH)uh"
该Statement取得的ResultSet就是可滚动的 /4Df 'd
2、创建PreparedStatement时指定参数 ZysZS%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); PkqOBU*|=
ResultSet.absolute(9000); g^`;B"
批量更新 iC$mb~G
1、Statement RhL!Zz
Statement sm = cn.createStatement(); Vm3e6Y,K
sm.addBatch(sql1); c:$W5j('Z
sm.addBatch(sql2); WNE=|z#|
... \[!k`6#t7
sm.executeBatch() "Z\^dR
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 `1 tD&te0
2、PreparedStatement xs'vd:l.Pp
PreparedStatement ps = cn.preparedStatement(sql); N:_U2[V^d
{ !yfQ^a_O
ps.setXXX(1,xxx); c)7i%RF'
... >$%rs c}^
ps.addBatch(); Os9;;^k
} &*w)/W
ps.executeBatch(); 7yp}*b{s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e>GX]tK
QcXqMx
事务的处理 ,hggmzA~
1、关闭Connection的自动提交 Sz"rp9x+
cn.setAutoCommit(false); f0<'IgN
2、执行一系列sql语句 x|TLMu=3=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close qh40nqS;9
Statement sm ; fw[Z7`\Q5
sm = cn.createStatement(insert into user...); =Nc}XFq
sm.executeUpdate(); SccaX
P
sm.close(); xM#+jI
sm = cn.createStatement("insert into corp...); GD]yP..
sm.executeUpdate(); C}7c:4c
sm.close(); qMHI-h_A
3、提交 z. 6-D
cn.commit(); A.D@21py
4、如果发生异常,那么回滚 e2P
ds`
cn.rollback();