java 数据库基本操作 N0/DPZX7
1、java数据库操作基本流程 &|55:Y87
2、几个常用的重要技巧: LUJKR6oT{>
可滚动、更新的记录集 :3u>%
批量更新 Eiwo==M
事务处理 #=+d;RdlW
XG*Luc-v
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6x6PP}IX
1、取得数据库连接 rFdovfb
1)用DriverManager取数据库连接 R~;<}!Gtx
例子 r1xNU0A
String className,url,uid,pwd; V[Auw3)
className = "oracle.jdbc.driver.OracleDriver"; n|3ENN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #(!>
uid = "system"; lcyan
pwd = "manager"; vMDV%E S1t
Class.forName(className); <+pwGKtD
Connection cn = DriverManager.getConnection(url,uid,pwd); l *.#g
2)用jndi(java的命名和目录服务)方式 gHA"O@HgDI
例子
"ifYy>d
String jndi = "jdbc/db"; leX&py
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *N<~"D
DataSource ds = (DataSource) ctx.lookup(jndi); hbzU?_}
Connection cn = ds.getConnection(); a\aJw[d{
多用于jsp中 #(T
2、执行sql语句 ti3T?_
1)用Statement来执行sql语句 EO3?Dev
String sql; 7k{C'\m
Statement sm = cn.createStatement(); iIA&\'|;i
sm.executeQuery(sql); // 执行数据查询语句(select) '$;S?6$eW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5c!~WckbJ
2)用PreparedStatement来执行sql语句 9SXFiZA(r
String sql; DNC2]kS<
sql = "insert into user (id,name) values (?,?)"; 8"Hy'JA$O
PreparedStatement ps = cn.prepareStatement(sql); {Jwh .bJ
ps.setInt(1,xxx); (
{5LB4
ps.setString(2,xxx); 9}jF]P*Q
... >2,x#RQs
ResultSet rs = ps.executeQuery(); // 查询 +|KnO
int c = ps.executeUpdate(); // 更新 Ztr,v$
=gw'MA
3、处理执行结果 YrL:!\p.
查询语句,返回记录集ResultSet ,QdUfM
更新语句,返回数字,表示该更新影响的记录数 {-09,Q4[&
ResultSet的方法 IXe[JL:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false j"9bt GX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nYLq%7}k
u4, p.mZtb
4、释放连接 kW3V"twx
cn.close(); #\_N-bVu
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a4Fe MCvV9
S{7A3
x'B
可滚动、更新的记录集 k$j>_U? P
1、创建可滚动、更新的Statement y}FTLX $
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); tQ&.;{5[f
该Statement取得的ResultSet就是可滚动的 LaG./+IP
2、创建PreparedStatement时指定参数 pMe'fC~*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); MOKg[j
ResultSet.absolute(9000); 0V@u]
批量更新 -O:+?gG
1、Statement Ux2(Oph
Statement sm = cn.createStatement(); #;#
V1
sm.addBatch(sql1); 4
>at#Zc
sm.addBatch(sql2); /ZUKt
... 9,sj,A1
sm.executeBatch() "k o?AUt
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4siNY4i"
2、PreparedStatement gu7mGHn-
PreparedStatement ps = cn.preparedStatement(sql);
pQKR
{ #H fvY}[o
ps.setXXX(1,xxx); z:{'IY
... waz)jEk
ps.addBatch(); Zui2O-L?V
} I6,'o)l{_
ps.executeBatch(); NTkGLD1e.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4p\<b8(9>
*Fi`o_d9[`
事务的处理 /'ccFm2
1、关闭Connection的自动提交
O
KVIl
cn.setAutoCommit(false); KuL2X@)}
2、执行一系列sql语句 01uMbtM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 33z)F
Statement sm ; ^1sX22k
sm = cn.createStatement(insert into user...); 4C\>JGZvq
sm.executeUpdate(); }(4U7Ac
sm.close(); sKVN*8ia
sm = cn.createStatement("insert into corp...); $!)Sgb
sm.executeUpdate(); xDD3Y{K
sm.close(); t;!vjac
3、提交 hy3j8?66
cn.commit(); ;}"_hLX
4、如果发生异常,那么回滚 [p^N].K$
cn.rollback();