java 数据库基本操作 3_.%NgES|
1、java数据库操作基本流程 kB%.i%9\\
2、几个常用的重要技巧: }8s&~fH
可滚动、更新的记录集 _g-0"a{-
批量更新 WQ9Q:F2
事务处理 gVy`||z
4#:C t* f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EXwU{Hl
1、取得数据库连接 owI:Qs_/4
1)用DriverManager取数据库连接 |68u4z K
例子 @1' Y/dCyD
String className,url,uid,pwd; EWY'E;0@5
className = "oracle.jdbc.driver.OracleDriver"; ZE=
Yn~XM
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; P,(_y8
uid = "system"; g++-v HD
pwd = "manager"; EEo I|
Class.forName(className); (_6JQn
Connection cn = DriverManager.getConnection(url,uid,pwd); #k[Y(_
2)用jndi(java的命名和目录服务)方式 yk(r R
例子 IYHNN
String jndi = "jdbc/db"; G]{^.5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |n^rI\p%
DataSource ds = (DataSource) ctx.lookup(jndi); .g?D3$|K
Connection cn = ds.getConnection(); >3~)2)Q
多用于jsp中 u:6R|%1fNn
2、执行sql语句 I?Z"YR+MQ
1)用Statement来执行sql语句 .}uri1k"@k
String sql; W$`#X
Statement sm = cn.createStatement(); U0iV
E+)Bt
sm.executeQuery(sql); // 执行数据查询语句(select) jw
5 U-zi
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); HLdHyK/S
2)用PreparedStatement来执行sql语句 nJ/}b/A{
String sql; rl&.|;5uH;
sql = "insert into user (id,name) values (?,?)"; ^FVmP d*1
PreparedStatement ps = cn.prepareStatement(sql); MJCz %zK
ps.setInt(1,xxx); b'z\|jY
ps.setString(2,xxx); XHOS"o$y
... l N0u1)'2
ResultSet rs = ps.executeQuery(); // 查询 *-uzsq.W
int c = ps.executeUpdate(); // 更新 wh2E$b(-
& JJ*?Dl
3、处理执行结果 _ n1:v~
查询语句,返回记录集ResultSet shP}T[<
更新语句,返回数字,表示该更新影响的记录数 F2ISg'
ResultSet的方法 wA)nryXV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false OVc)PMp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2-Wy@\
>oaL -01i
4、释放连接 ;t,v/(/3
cn.close(); 3 TTQff
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zSu,S4m_;
K5t.OAA:
可滚动、更新的记录集 E7_OI7C
1、创建可滚动、更新的Statement '#eT
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8?x:PkK
该Statement取得的ResultSet就是可滚动的 pYu6[
2、创建PreparedStatement时指定参数 /L5:/Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); q_mxZM
->
ResultSet.absolute(9000); jzZ]+'t
批量更新 8OO[Le]1
1、Statement
U0srwt97S
Statement sm = cn.createStatement(); (<-m|H};
sm.addBatch(sql1); ll- KK`Ka
sm.addBatch(sql2); 0
0|!g"E>$
... w`3.wALb
sm.executeBatch() .+<Ka0
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 eH[i<Z
2、PreparedStatement r y@p
PreparedStatement ps = cn.preparedStatement(sql); ^tI&5S]nE
{ <[K)PI
ps.setXXX(1,xxx); m|t\w|B2
... *[BtW56-
ps.addBatch(); P=\Hi.]%
} g W9`k,U
ps.executeBatch(); R,=8)OI2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rKd|s7l
mZmEE2h
事务的处理 (/!@
-]1
1、关闭Connection的自动提交 r4fg!]J;
cn.setAutoCommit(false); )0"T?Ivp]
2、执行一系列sql语句 =6i+K.}e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o^//|]H3Y
Statement sm ; F-
u"zox
sm = cn.createStatement(insert into user...); -T-yt2h(
sm.executeUpdate(); Z glU{sU
sm.close(); Zk>m!F>,p
sm = cn.createStatement("insert into corp...); a/3'!} &e
sm.executeUpdate(); t~nW&]E
sm.close(); inZ0iU9dy
3、提交 moh,a B#
cn.commit(); q(L.i)w$
4、如果发生异常,那么回滚 z"QXPIXPk
cn.rollback();