java 数据库基本操作 V3UEuA
1、java数据库操作基本流程 zpY8w#b
2、几个常用的重要技巧: MT3UJ6 ~P
可滚动、更新的记录集 M|\XFO
批量更新 qU}[(9~Ru
事务处理 g,.iM8
wBr0s*1I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <fP|<>s$@1
1、取得数据库连接 8.vD]hO
1)用DriverManager取数据库连接 ^*ZO@GNL
例子 0_ ;-QAd
String className,url,uid,pwd; |{$Vk%cUE
className = "oracle.jdbc.driver.OracleDriver"; [ [Z*n/tr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $+Xohtt
uid = "system"; J~~WV<6
pwd = "manager"; Alrk3I3{
Class.forName(className); zfS`@{;F`|
Connection cn = DriverManager.getConnection(url,uid,pwd); *@D.=i>
2)用jndi(java的命名和目录服务)方式 I!{5*~ 3
例子 ?O28Q DUI
String jndi = "jdbc/db"; kw!! 5U;7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V%"aU}
DataSource ds = (DataSource) ctx.lookup(jndi);
w*aKb
Connection cn = ds.getConnection(); d
hh`o\$
多用于jsp中 #zfBNkk &@
2、执行sql语句 _- { > e
1)用Statement来执行sql语句 NZv1dy`fa
String sql; ,Q^.SHP8
Statement sm = cn.createStatement(); }4$UlTA'
sm.executeQuery(sql); // 执行数据查询语句(select) . }^m8PP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); H=*;3gM,'
2)用PreparedStatement来执行sql语句 l{kum2DT
String sql; |_Vlw&qu+
sql = "insert into user (id,name) values (?,?)"; Obbjl@]
PreparedStatement ps = cn.prepareStatement(sql); \h :$q E7
ps.setInt(1,xxx); UF?qL1w
ps.setString(2,xxx); At"@`1n_u'
... b8Y-!]F
ResultSet rs = ps.executeQuery(); // 查询 l@':mX3xd
int c = ps.executeUpdate(); // 更新 h]I ^%7
yAaMYF@
3、处理执行结果 U1I2+;"#A
查询语句,返回记录集ResultSet mzDbw-#
更新语句,返回数字,表示该更新影响的记录数 @<h@d_8^k
ResultSet的方法 H>2)R7h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false \\6/"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 PKmr5FB
Y\s@'UoVN
4、释放连接 <&B)i\j8=b
cn.close(); Zhf+u
r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '?4B0=
yH irm|o
可滚动、更新的记录集 a8NL
1、创建可滚动、更新的Statement y4+Km*am,W
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Oo$i,|$$
该Statement取得的ResultSet就是可滚动的 L~>pSP^a
2、创建PreparedStatement时指定参数 wgY:W:y'N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ttgb"Wb%S
ResultSet.absolute(9000);
ym^
批量更新 4/cUd=>Z
1、Statement %R."
Statement sm = cn.createStatement(); \Gg6&:Ua
sm.addBatch(sql1); IvO#tI
sm.addBatch(sql2);
ji5c0WH
... `StlG=TB8
sm.executeBatch() b{_J%p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 mqQN*.8*
2、PreparedStatement YB*I'm3q
PreparedStatement ps = cn.preparedStatement(sql); ibha`
{ T:dV[3
ps.setXXX(1,xxx); "|`euxYV
... )17CG*K1
ps.addBatch(); )k$ +T%
} V_^p?Fi#
ps.executeBatch(); M]
7#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /GRkQ",
WTbq)D(&[_
事务的处理 E&9BeU
a#
1、关闭Connection的自动提交 g{RVxGE7
cn.setAutoCommit(false); VB o=*gn,$
2、执行一系列sql语句 C8ek{o)%W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DgW*Br8<
Statement sm ; Y'H|Tk^`
sm = cn.createStatement(insert into user...); P 9c!
sm.executeUpdate(); br`cxgZ0"
sm.close(); ~qT5F)$B-
sm = cn.createStatement("insert into corp...); b"iPuN!p
sm.executeUpdate(); ;<hLy(@
sm.close(); <*oTVl4fS
3、提交 lk;4l Z
cn.commit(); m7!Mstu
4、如果发生异常,那么回滚 n3y`='D
cn.rollback();