java 数据库基本操作 : +Na8\d
1、java数据库操作基本流程 C-i9F%..
2、几个常用的重要技巧: P9Yee!*H
可滚动、更新的记录集 zX{O"w
批量更新 K4\{G
事务处理 @>>8CU^~
;VhilWaF-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %49P<vo`?
1、取得数据库连接 {+`'ZU6C
1)用DriverManager取数据库连接 4R 9lA
例子 asDk@Gcu
String className,url,uid,pwd; _Xs(3V@'}
className = "oracle.jdbc.driver.OracleDriver"; nitKX.t8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }e/#dMEi
uid = "system"; 5)tDgm
pwd = "manager"; W6~aL\[
Class.forName(className); criQa<N"
Connection cn = DriverManager.getConnection(url,uid,pwd); C[E[|s*l
2)用jndi(java的命名和目录服务)方式 0:NCIsIm<
例子 #%Z 0!
String jndi = "jdbc/db"; DdUT"%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $KSdNFtM)A
DataSource ds = (DataSource) ctx.lookup(jndi); R,+Pcn$ws
Connection cn = ds.getConnection(); N*J!<vY"
多用于jsp中 vBFMne1h
2、执行sql语句 y
{&"g
1)用Statement来执行sql语句 M)m(
String sql; mEL<d,XhI
Statement sm = cn.createStatement(); .<#oLM^
sm.executeQuery(sql); // 执行数据查询语句(select) yf >
rG
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #6fQ$x(F#j
2)用PreparedStatement来执行sql语句 $&fP%p
String sql; g 0Rny
sql = "insert into user (id,name) values (?,?)"; ua!i3]18
PreparedStatement ps = cn.prepareStatement(sql); ){-Tt`0(u
ps.setInt(1,xxx); 9' $\GN{0
ps.setString(2,xxx); 49('pq?D
... 3shRrCL0mf
ResultSet rs = ps.executeQuery(); // 查询 XZh1/b^DMN
int c = ps.executeUpdate(); // 更新 @2yoy&IO
D8OW|wVE
3、处理执行结果 c0I;8z`b
查询语句,返回记录集ResultSet ~__r-z
更新语句,返回数字,表示该更新影响的记录数 A7`+XqG
ResultSet的方法 ec8iZ8h8
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g6 AEMer
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 PZ#\O
3]46qk'
4、释放连接 ^ gy"$F3{`
cn.close(); 6dH> 0l
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [:hTwBRF
`>HM<Nn-0
可滚动、更新的记录集 @IXvp3r
1、创建可滚动、更新的Statement "dkDT7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /JqNiqvh
该Statement取得的ResultSet就是可滚动的 >'eY/>n{
2、创建PreparedStatement时指定参数 j1Ns|oph1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bjL8Wpk
ResultSet.absolute(9000); vtByC u5
批量更新 &c AFKYt
1、Statement EDDld6O,
Statement sm = cn.createStatement(); ;bYpMcH
sm.addBatch(sql1); hL?"!
sm.addBatch(sql2); q PveG1+25
...
Qhc>,v)
sm.executeBatch() Ii.0Bul
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 OMY^'g%w
2、PreparedStatement T)Uhp
PreparedStatement ps = cn.preparedStatement(sql); ,(;T V_@$
{ 8wf[*6VwV
ps.setXXX(1,xxx); kndN} Vq
... 6L/`
ps.addBatch(); j7XUFA
} Il4R R
ps.executeBatch(); %&iY5A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ["u:_2!4P
j}`XF?2D
事务的处理 <rKfL`8p
1、关闭Connection的自动提交 FjU
-t/
cn.setAutoCommit(false); a>o]garB+
2、执行一系列sql语句 WC7ltw2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ML!>tCT
Statement sm ; 6)]zt
sm = cn.createStatement(insert into user...); r%uka5@
sm.executeUpdate(); #5%\~f
sm.close(); sZDxTP+
sm = cn.createStatement("insert into corp...); VF bso3q<j
sm.executeUpdate(); 2(i@\dZCb<
sm.close(); h,fC-+H5
3、提交 (teK0s;t5k
cn.commit(); mS9ITe
M
4、如果发生异常,那么回滚 Z,"f2UJ
cn.rollback();