java 数据库基本操作 Zv5vYe9Ow
1、java数据库操作基本流程 /2x@Z>
2、几个常用的重要技巧: A(D3wctdr
可滚动、更新的记录集 ,DD}o
批量更新 1'!%$D
事务处理 |.?Xov]
s-Qq#T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 BV)) #D9
1、取得数据库连接 hiw>Q7W
1)用DriverManager取数据库连接 *:Uq
;)*
例子 Hn}m}A
String className,url,uid,pwd; OV/
&'rC
className = "oracle.jdbc.driver.OracleDriver"; 34I;DUdcE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; oIGF=x,e8
uid = "system"; 9dwLkr
pwd = "manager"; eL1)_M;{
Class.forName(className); PM3fJhx
Connection cn = DriverManager.getConnection(url,uid,pwd); :U,-v
2)用jndi(java的命名和目录服务)方式 +ctJV>
例子 }oL
l?L
String jndi = "jdbc/db"; zsr; 37
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); `RyH~4\;
DataSource ds = (DataSource) ctx.lookup(jndi); *YP:-
Connection cn = ds.getConnection(); I_is3y0
多用于jsp中 gTk*v0WBm
2、执行sql语句 L}VQc9"gc
1)用Statement来执行sql语句 nq:'jdY5|
String sql; "h:#'y$V
Statement sm = cn.createStatement(); ;umbld0
sm.executeQuery(sql); // 执行数据查询语句(select) 9)$gD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); br')%f}m
2)用PreparedStatement来执行sql语句 vlo!D9zsV3
String sql; d0YQLh
sql = "insert into user (id,name) values (?,?)"; +wcif-
PreparedStatement ps = cn.prepareStatement(sql); U
nS|""
ps.setInt(1,xxx); 2Yg\<PsN
ps.setString(2,xxx); = ,c!V
... 5zPn-1uW
ResultSet rs = ps.executeQuery(); // 查询 XnB-1{a1
int c = ps.executeUpdate(); // 更新 M%2w[<-8c
/%AA\`:6
3、处理执行结果 ?ajVf./Ja
查询语句,返回记录集ResultSet z}-8pDD'
更新语句,返回数字,表示该更新影响的记录数 .xe+cK
ResultSet的方法 !=?Q>mz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8u"HW~~=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mW1T4rR'
s lYC\"$
4、释放连接 SHQgI<D7
cn.close(); )PvB^n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rSKZc`<^
R) J/z
可滚动、更新的记录集 g:?p/L
1、创建可滚动、更新的Statement =QhK|C!$A
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '~E=V:6
该Statement取得的ResultSet就是可滚动的 s} oD?h:T3
2、创建PreparedStatement时指定参数 ]JlM/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); S5e"}.]|
ResultSet.absolute(9000); Is>~ P*2Y=
批量更新 h"dn:5G:=
1、Statement l8+;)2p!
Statement sm = cn.createStatement(); I[P_j`aE
sm.addBatch(sql1); R T/)<RT9
sm.addBatch(sql2); gb/<(I )
... I~ e,']
sm.executeBatch() Q@/Z~xw"'I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ie/dMB=t
2、PreparedStatement s ?|Hw|j
PreparedStatement ps = cn.preparedStatement(sql); %(>,eee_
{ n4 o}}tI
ps.setXXX(1,xxx); S^nI=HTm
... `It3X.^}
ps.addBatch(); \`-a'u=S
} %jxeh.B3B
ps.executeBatch(); z7R2viR[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 d8&T62Dnd4
F_~A8y
事务的处理 2 @t?@,c
1、关闭Connection的自动提交 `W2
o~r*&
cn.setAutoCommit(false); 4oN*J +"=+
2、执行一系列sql语句 j>#ywh*A
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4}Yn!"jW&
Statement sm ; WntolYd
sm = cn.createStatement(insert into user...); URj2 evYW
sm.executeUpdate(); &S8,-~U
sm.close(); c N~F32<
sm = cn.createStatement("insert into corp...); !wH'dsriD
sm.executeUpdate(); L4v26*P
sm.close(); ?4#wVzuzA
3、提交 63c\1]YB.
cn.commit(); =*KY)X
4、如果发生异常,那么回滚 ^a=V.
cn.rollback();