java 数据库基本操作 ^NrC8,p
1、java数据库操作基本流程 ($[@'?Z1
2、几个常用的重要技巧: i7`/"5I
可滚动、更新的记录集 z"Wyf6H0T
批量更新 >"D0vj
事务处理 V""3#Tw
gO bP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 20 )8e!jP
1、取得数据库连接 "Wy!,RH
1)用DriverManager取数据库连接 K?=g
IC:
例子 1fV\84m^
String className,url,uid,pwd; -\g@s@5
className = "oracle.jdbc.driver.OracleDriver"; {QIdeB[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]GzfU'fOn|
uid = "system"; #wF6Wx iG
pwd = "manager"; d4LH`@SUZ-
Class.forName(className); _p%@x:\
Connection cn = DriverManager.getConnection(url,uid,pwd); t#7owY$^
2)用jndi(java的命名和目录服务)方式 ~\Udl
例子 mnM$#%q;%
String jndi = "jdbc/db"; =Ct$!uun
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2XV3f$, H
DataSource ds = (DataSource) ctx.lookup(jndi); $lF\FC
Connection cn = ds.getConnection(); /+f3jy:d
多用于jsp中 .;37 e
2、执行sql语句 jk5C2dy
1)用Statement来执行sql语句 \5F
{MBx !
String sql; U.J/ "}5`T
Statement sm = cn.createStatement(); ?DC;Hk<
sm.executeQuery(sql); // 执行数据查询语句(select) &FDWlrGg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =2d h}8Mz
2)用PreparedStatement来执行sql语句 }1YQ?:@
String sql; 'l._00yu
sql = "insert into user (id,name) values (?,?)"; _@sSVh$+
PreparedStatement ps = cn.prepareStatement(sql); 27UnH: =
ps.setInt(1,xxx); %kiPE<<x
ps.setString(2,xxx); 6{2 9cX.
... \C`2z]V%
ResultSet rs = ps.executeQuery(); // 查询 t,qz%J&a
int c = ps.executeUpdate(); // 更新 CPu~^ik
`YK#m4gc
3、处理执行结果 0|~3\e/QV
查询语句,返回记录集ResultSet m"~),QwF9
更新语句,返回数字,表示该更新影响的记录数 ptTp63+
ResultSet的方法 BtKbX)R$J
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tZA%^Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [?F]S:/i
3$ BYfI3H
4、释放连接 j8ag}%
cn.close(); zG~nRt{4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $ !:xjb
k#<Y2FJa
可滚动、更新的记录集 CK1gzIg>
1、创建可滚动、更新的Statement /XwwB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nY_+V{F
该Statement取得的ResultSet就是可滚动的 >\>!Q V1@
2、创建PreparedStatement时指定参数 [K `d?&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); incUa;
ResultSet.absolute(9000); ASaNac-3
批量更新 tN&X1
1、Statement ;h7O_|<%
Statement sm = cn.createStatement(); E^t}p[s
sm.addBatch(sql1); 2$?j'i!
sm.addBatch(sql2); G4)X~.Fy
... \yY2 mr
sm.executeBatch() r'& 6P-Vm
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P>ZIP*
Gr
2、PreparedStatement jR{Rd}QtQ
PreparedStatement ps = cn.preparedStatement(sql); pAc "Wo(Q
{ GD
}i=TK
ps.setXXX(1,xxx); rTM0[2N
... o`\@Yq$.
ps.addBatch(); (?~*.g!
} \_3#%%z
ps.executeBatch(); A]OVmw
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *@[+C~U
"$|ne[b2
事务的处理 /w:~!3Aj0+
1、关闭Connection的自动提交 SgY\h{{sP
cn.setAutoCommit(false); q@Sj$
2、执行一系列sql语句 yx/.4DW1Ua
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2R`}}4<Z
Statement sm ; -P=Hp/ELi
sm = cn.createStatement(insert into user...); *gN)a%9
sm.executeUpdate(); NU!B|l
sm.close(); O:W4W=K
sm = cn.createStatement("insert into corp...); Z+C&?K
sm.executeUpdate(); GsC4ty
sm.close(); ri1:q.:I]
3、提交 Iih]q
cn.commit(); ^|=3sJ4[U
4、如果发生异常,那么回滚 Dhp|%_>
cn.rollback();