java 数据库基本操作 +R|U4`12
1、java数据库操作基本流程 eV[`P&j_C
2、几个常用的重要技巧: t$U3|r
可滚动、更新的记录集 nc3sty1`
批量更新 E:u ReT
事务处理 L*zbike
(NGu9uJs
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 e$CePLEj
1、取得数据库连接 %v5)s(Yu
1)用DriverManager取数据库连接 vVI6m{zYV
例子 j2RRSz&9
String className,url,uid,pwd; [leW/2i
className = "oracle.jdbc.driver.OracleDriver"; cvZni#o2)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?j1_
n,d
uid = "system"; a$w},=
`E
pwd = "manager"; VK @$JwdL
Class.forName(className); z=ML(1c=
Connection cn = DriverManager.getConnection(url,uid,pwd); OJ v}kwV
2)用jndi(java的命名和目录服务)方式 |BwRlE2CFO
例子 RY9+ 9i
String jndi = "jdbc/db"; ]vm\3=@}9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); BX@pt;$ek7
DataSource ds = (DataSource) ctx.lookup(jndi); q>^hoW2$C
Connection cn = ds.getConnection();
@bY('gC,
多用于jsp中 /h/6&R0l
2、执行sql语句 1|o$X
1)用Statement来执行sql语句 T#\p%w9d
String sql; (7IqY1W
Statement sm = cn.createStatement(); ykxbX
sm.executeQuery(sql); // 执行数据查询语句(select) q^Z~IZ8IT
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +p13xc?#j
2)用PreparedStatement来执行sql语句 -G8c5b[
String sql; VBu8}}Ql
sql = "insert into user (id,name) values (?,?)"; ./#e1m?.
PreparedStatement ps = cn.prepareStatement(sql); 'dkXYtKCB
ps.setInt(1,xxx); uA~YRKer
ps.setString(2,xxx); y)6,0K {k
... NA+&jV
ResultSet rs = ps.executeQuery(); // 查询 G7
1U 7
int c = ps.executeUpdate(); // 更新 sa_R$ /H
N*~_\x
3、处理执行结果 >Y}7[XK
查询语句,返回记录集ResultSet UQ5BH%EPb
更新语句,返回数字,表示该更新影响的记录数 %moJF1
ResultSet的方法 Iph3%RaE
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
\;-qdV_JB
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;SfNKu
U);OR
4、释放连接 6^Ph '
cn.close(); {]=v]O|,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection IQT cYl
3=Z<wD s
可滚动、更新的记录集 {] O`gG
1、创建可滚动、更新的Statement 2-~a
P
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wDDx j
该Statement取得的ResultSet就是可滚动的 \3r3{X
_<`
2、创建PreparedStatement时指定参数 IeVLn^?+:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); B]1HS`*7
ResultSet.absolute(9000); x"vwWJNQ
批量更新 Xq|nJ|h
1、Statement WM/#.
Statement sm = cn.createStatement(); Mec{_jiH&D
sm.addBatch(sql1); -PM)EGSk{
sm.addBatch(sql2); h}avX*Lx_
... #Rc5c+/(
sm.executeBatch() eK9TAW
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 iSlFRv?a
2、PreparedStatement o
w2$o\hC
PreparedStatement ps = cn.preparedStatement(sql); |=\91fP68`
{ R aefj(^V
ps.setXXX(1,xxx); 1 o|T
... <{giHT
ps.addBatch(); Rvvh{U;t
} `|]e6Pb
ps.executeBatch(); }'lNi^"XL
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q!K`e )R
uyFn}y62
事务的处理 B
s,as
1、关闭Connection的自动提交 NgHpIonC
cn.setAutoCommit(false); +jtA&1cf
2、执行一系列sql语句 " \:ced
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close MD<-w|#8IV
Statement sm ; nX._EC
sm = cn.createStatement(insert into user...); Z v4<b
sm.executeUpdate(); =D].`
sm.close(); ~Eq \DK
sm = cn.createStatement("insert into corp...); =<{ RX8
sm.executeUpdate(); {rC~P
sm.close(); ZW*n /#GUC
3、提交 JvkL37^n:
cn.commit(); u?kD)5Nk
4、如果发生异常,那么回滚 !qA8Zky_
cn.rollback();