java 数据库基本操作 |vTirZP
1、java数据库操作基本流程 6H VS0
2、几个常用的重要技巧: s3_i5,y
可滚动、更新的记录集 Z=R>7~H
批量更新 w^p
'D{{
事务处理 20zIO.&o
B HoZ}1_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %9-).k
1、取得数据库连接 =NF},j"
1)用DriverManager取数据库连接 05DK-Wh?
例子 >Bskw2
String className,url,uid,pwd; '8i
np[_
className = "oracle.jdbc.driver.OracleDriver"; \0(QO8.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; mV`Z]-$$i
uid = "system"; # u^F B
pwd = "manager"; *ta|,
Class.forName(className); zL3~,z/o
Connection cn = DriverManager.getConnection(url,uid,pwd); %nF6n:| :
2)用jndi(java的命名和目录服务)方式 \[]36|$LS
例子 :8E(pq|1PB
String jndi = "jdbc/db"; ;r^8In@6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6g@j,iFy
DataSource ds = (DataSource) ctx.lookup(jndi); :5U(}\dL{
Connection cn = ds.getConnection(); 2p@Rr7
多用于jsp中 Qgo0uuM
2、执行sql语句 lx U}HM
1)用Statement来执行sql语句 f Nm
Sx
String sql; sUfH1w)0
Statement sm = cn.createStatement(); !7AW_l9`i
sm.executeQuery(sql); // 执行数据查询语句(select) eO(VSjo'`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lp!@uoN^T
2)用PreparedStatement来执行sql语句 DD"]as"#
String sql; <z %zzc1s
sql = "insert into user (id,name) values (?,?)"; m,Q<4'
PreparedStatement ps = cn.prepareStatement(sql); H:,rNaz7D^
ps.setInt(1,xxx); jp=^$rS6[
ps.setString(2,xxx); x?va26FV
... 2Ev~[Hb.
ResultSet rs = ps.executeQuery(); // 查询 lY.FmF}k
int c = ps.executeUpdate(); // 更新 mZ7.#R*}
lmj73OB3
3、处理执行结果 {\;CGoN|
查询语句,返回记录集ResultSet Gow_a'
更新语句,返回数字,表示该更新影响的记录数 2P!Pbl<
ResultSet的方法 s7(mNpo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R\A5f\L9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 iW-w?!>|m
2[r#y1ro
4、释放连接 k
U*\Fa*E
cn.close(); d=xU
f`^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8!b#ez
8g(%6 ET
可滚动、更新的记录集 d01bt$8>
1、创建可滚动、更新的Statement 4@/[aFH
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); h[ba$S,T
该Statement取得的ResultSet就是可滚动的 z1T.\mzfX
2、创建PreparedStatement时指定参数 BtVuI5*h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5mnIQ~psR
ResultSet.absolute(9000); E2LpQNvN%g
批量更新 <[ 8at6;
1、Statement jGb+bN5U7
Statement sm = cn.createStatement(); qI^6}PB
sm.addBatch(sql1); .N5}JUj
sm.addBatch(sql2); 5``/exG>
... ,Tvk&<!0
sm.executeBatch() Dx 4?6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *-3K],^a
2、PreparedStatement f lR6^6E
PreparedStatement ps = cn.preparedStatement(sql); qg'RD]a> R
{ ~>k<I:BtrT
ps.setXXX(1,xxx); 9,`WQ+OI
... %%G2w63M
ps.addBatch(); A%k@75V@
} l<(MC R*
ps.executeBatch();
3RXq/E
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 oa}-=hG
A=I]1r
事务的处理 U$# ?Lw
1、关闭Connection的自动提交 TlQ#0_as[
cn.setAutoCommit(false); Xb?P'nD
2、执行一系列sql语句 ?`uY*+u
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Eu l,1yR
Statement sm ; R',Q)<
sm = cn.createStatement(insert into user...); Al5E
sm.executeUpdate(); rs]%`"&=
sm.close(); g&`e2|[7
sm = cn.createStatement("insert into corp...); #[qmhU{s
sm.executeUpdate(); =n
cu#T]
sm.close(); !L2R0Y:a
3、提交 L1VUfEG-
cn.commit(); Ha[Bf*
4、如果发生异常,那么回滚 brl(7_2
cn.rollback();