java 数据库基本操作 .V_5q:tu
1、java数据库操作基本流程 \xC#Zs[<
2、几个常用的重要技巧: 6jm/y@|F!
可滚动、更新的记录集 368 g>/#'
批量更新 rqm":N8@
事务处理 -w)v38iX!
/f+BeQ3#/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hPgYKa8u
1、取得数据库连接 L@Qvj-5e
1)用DriverManager取数据库连接 ?pd/cj^
例子 #RSUChe7w
String className,url,uid,pwd; DZH2U+K
className = "oracle.jdbc.driver.OracleDriver"; Hm|N{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Vl<7>
uid = "system"; ~P~q'
pwd = "manager"; OmfHrlA
Class.forName(className); S-7 C'dc
Connection cn = DriverManager.getConnection(url,uid,pwd); .We{W{
2)用jndi(java的命名和目录服务)方式 c_.Fe'E
例子 i?eVi
String jndi = "jdbc/db"; % hH> %
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $ZB`4!JxG
DataSource ds = (DataSource) ctx.lookup(jndi); W* v3B.
Connection cn = ds.getConnection(); A>FWvlLw'm
多用于jsp中 N
Mx:Jh-YN
2、执行sql语句 Y!Io @{f
1)用Statement来执行sql语句 #67 7,dn
String sql; ;7H^;+P
Statement sm = cn.createStatement(); +/ M%%:>mY
sm.executeQuery(sql); // 执行数据查询语句(select) @*=5a(#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); d(b~s2\i
2)用PreparedStatement来执行sql语句 {L.uLr_?e
String sql; _nX8f
&
sql = "insert into user (id,name) values (?,?)"; :B7U),T
PreparedStatement ps = cn.prepareStatement(sql); #!#s7^%K&
ps.setInt(1,xxx); K,U8 vc
ps.setString(2,xxx); # Oq.}x?i
... 0B}2~}#
ResultSet rs = ps.executeQuery(); // 查询 :Y9/} b{
int c = ps.executeUpdate(); // 更新 `(I$_RSE")
pW>{7pXn
3、处理执行结果 88?O4)c
查询语句,返回记录集ResultSet 0plX"NU
更新语句,返回数字,表示该更新影响的记录数 aS\$@41"
ResultSet的方法 ),xD5~_=q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zf^|H%
~^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \ptjnwC^O
L$kB(Brw
4、释放连接 "Y- WY,H
cn.close(); 9ZY,T]ym?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @tD (<*f+
"J+4
可滚动、更新的记录集 ?`O^;f
1、创建可滚动、更新的Statement g+<[1;[-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r=54@`O!
该Statement取得的ResultSet就是可滚动的 0!$y]Gr
2、创建PreparedStatement时指定参数 3 5L0CM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iy]?j$B$
ResultSet.absolute(9000); (-&d0a9N
批量更新 hv\Dz*XTs0
1、Statement Y|
ch ;
Statement sm = cn.createStatement(); YV@efPy}n
sm.addBatch(sql1); B##X94aTT
sm.addBatch(sql2); Z;RUxe|<k
... JAXD\StC
sm.executeBatch() #reW)P>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 HSAr6h
2、PreparedStatement \/V#,O
PreparedStatement ps = cn.preparedStatement(sql); OIjSH~a.
{ 6CW5ay_,
ps.setXXX(1,xxx); x',6VTz^
... &`tAQN*Z
ps.addBatch(); 4udj"-V
} urCTP.F
ps.executeBatch(); ~{vB2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 B<,7!:.II
kOq8zYU|
事务的处理 >s0![c oz
1、关闭Connection的自动提交 ~<s =yjTu+
cn.setAutoCommit(false); oDi+\0
2、执行一系列sql语句 Qh-:P`CN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WY!4^<|w"
Statement sm ; Dh?I
sm = cn.createStatement(insert into user...); 1KBGML-K3
sm.executeUpdate(); WjM7s]ZRv
sm.close(); (+/d*4
sm = cn.createStatement("insert into corp...); NuD|%Ebs
sm.executeUpdate(); {>~9?Xwh
sm.close(); `<M>"~W
3、提交 RgQs`aI
cn.commit(); _:p-\Oo.
4、如果发生异常,那么回滚 2+~gZxHq
cn.rollback();