java 数据库基本操作 O \8G~V
5"
1、java数据库操作基本流程 \ZWmef
2、几个常用的重要技巧: 9R"N#w.U]
可滚动、更新的记录集 n4T2'e
批量更新 p+UHJ&
事务处理 <JM%Kn )
vqz#V=J{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -01 1U!
1、取得数据库连接
0P3|1=
1)用DriverManager取数据库连接 @aN=U=
例子 9~%]|_(
String className,url,uid,pwd; PFgjWp"Y
className = "oracle.jdbc.driver.OracleDriver"; l'".}6S
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 42wC."A
uid = "system"; lv_%
pwd = "manager"; qZ_fQ@
Class.forName(className); `+BaDns
Connection cn = DriverManager.getConnection(url,uid,pwd); UH&1c8y}
2)用jndi(java的命名和目录服务)方式 RdvTtXg
例子 4$DliP
String jndi = "jdbc/db"; =k<4mlok^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4m[C-NB!g
DataSource ds = (DataSource) ctx.lookup(jndi); cW\Y?x
Connection cn = ds.getConnection(); Yk@s"qm3
多用于jsp中 _QUu'zJ
2、执行sql语句 \If!5N
1)用Statement来执行sql语句 u+'@>%7
String sql; -L3
|9k
Statement sm = cn.createStatement(); pXj/6+^
sm.executeQuery(sql); // 执行数据查询语句(select) Q*&aC|b&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^'53]b:
2)用PreparedStatement来执行sql语句 SOQ-D4q
String sql; vp75u93
sql = "insert into user (id,name) values (?,?)"; 2n;;Tso"
PreparedStatement ps = cn.prepareStatement(sql); !^bB/e
ps.setInt(1,xxx); r2F
ps.setString(2,xxx); 3et2\wOX1x
... V& j.>Y
ResultSet rs = ps.executeQuery(); // 查询 C\^<v&
int c = ps.executeUpdate(); // 更新 A.C278^O8
imCl{vt(kj
3、处理执行结果 DEp%\sj?
查询语句,返回记录集ResultSet lJ] \
更新语句,返回数字,表示该更新影响的记录数 4OZ5hH
h
ResultSet的方法 mx(%tz^t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QDgEJ%U-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 QD;f~fZ
(6#yw`\
4、释放连接 H0b6ZA%n
cn.close(); !0csNg!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection K9O,7h:x
FDd>(!>
可滚动、更新的记录集 E<#4G9O<
1、创建可滚动、更新的Statement ZR-s{2sl
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CBnouKc:
该Statement取得的ResultSet就是可滚动的 .Lr)~
2、创建PreparedStatement时指定参数 G<^]0`"+)t
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :UDn^(#
ResultSet.absolute(9000); 0B$7S,2
批量更新 ~UJu
@M
1、Statement <,4R2'
Statement sm = cn.createStatement(); vXM/nw|5
sm.addBatch(sql1); l88a#zUQDN
sm.addBatch(sql2); kGuk
-P
... $sL|'ZMbS
sm.executeBatch() q>|[JJ*6_N
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &A9A#It
2、PreparedStatement ZOrTbik
PreparedStatement ps = cn.preparedStatement(sql); @U
/3iDB\
{ 3+8"
ps.setXXX(1,xxx); ,+f0cv4
... m~j\?mb{+
ps.addBatch(); ~Riu*<
} 01{r^ZT`RH
ps.executeBatch(); ?y*+^E0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6`4W,
Y zBA{FE
事务的处理 `k}l$ih`X
1、关闭Connection的自动提交 ,8xP8T~Kmv
cn.setAutoCommit(false);
kF+ }.x%
2、执行一系列sql语句 >xZhK63C/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VM]GYz|#]
Statement sm ; APtselC
sm = cn.createStatement(insert into user...); *e-ptgO
sm.executeUpdate(); ,y8I)+
sm.close(); Z?~d']XD
sm = cn.createStatement("insert into corp...); e:GgA
sm.executeUpdate(); Id.Z[owC`Y
sm.close(); rxy{a
3、提交 $nfBvf
cn.commit(); @( n^S?(
4、如果发生异常,那么回滚
>NH4A_
cn.rollback();