java 数据库基本操作 "Bz#5kqnl
1、java数据库操作基本流程 7jr+jNsowj
2、几个常用的重要技巧: $GOF'
可滚动、更新的记录集 @1qdnU
批量更新 Nfv`
)n@
事务处理 OB++5Wd
LoOw]@>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z@~mu
1、取得数据库连接 ulk/I-y
1)用DriverManager取数据库连接 mRt/d
例子 ?0-3J )kW
String className,url,uid,pwd; `=Rxnl,<U
className = "oracle.jdbc.driver.OracleDriver"; r9<#R=r)}J
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !|
q19$
uid = "system"; ~Q]/=HK
pwd = "manager"; @i#=1)Ze
Class.forName(className); |+Z-'k~Q
Connection cn = DriverManager.getConnection(url,uid,pwd); IsVR4t]
2)用jndi(java的命名和目录服务)方式 YS<KyTb"
例子 HdTB[(
String jndi = "jdbc/db"; b8[
ayy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -~*kAh
DataSource ds = (DataSource) ctx.lookup(jndi); &i6JBZ#~,
Connection cn = ds.getConnection(); A<(Fn_&W
多用于jsp中 mR|']^!SE
2、执行sql语句 "*S_w N%
1)用Statement来执行sql语句 XsSDz}dg
String sql;
Y=H_U$
Statement sm = cn.createStatement(); .bRtK+}F#
sm.executeQuery(sql); // 执行数据查询语句(select) Q=Q&\.<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -Vs;4-B{9
2)用PreparedStatement来执行sql语句 Hq&MePl[
String sql; BAG#YZB
sql = "insert into user (id,name) values (?,?)"; nITkgN:s
PreparedStatement ps = cn.prepareStatement(sql); G7KOJZb+D
ps.setInt(1,xxx); b(adM3MP
ps.setString(2,xxx); 1\AcceJ|(w
... _`Y%Y6O1/
ResultSet rs = ps.executeQuery(); // 查询 1c*:"
k
int c = ps.executeUpdate(); // 更新 =B`=f,,#3
2_Zn?#G8dl
3、处理执行结果 3ly]DTbz
查询语句,返回记录集ResultSet BqavI&1=
更新语句,返回数字,表示该更新影响的记录数 A'D2uV
ResultSet的方法 U.=TjCW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 'b6qEU#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )EcfEym.>
+x?8\
4、释放连接 dsK*YY jH
cn.close(); mZ0_^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection QVmJ_WT
B->oTC`5
可滚动、更新的记录集 ,,g: x
1、创建可滚动、更新的Statement B- |C%~fe
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]6MXG%
该Statement取得的ResultSet就是可滚动的 E{\T?dk1$
2、创建PreparedStatement时指定参数 \_)mWK,h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); TXbi>t:/S{
ResultSet.absolute(9000); Z4{N|h?
批量更新 O7J V{'?
1、Statement 7c<_j55(
Statement sm = cn.createStatement(); $J]NWgXl@
sm.addBatch(sql1); RF~c/en
sm.addBatch(sql2); ?9T,sX:
... ']H*f2y
sm.executeBatch() d7Z$/ $
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 I]Z"?T
2、PreparedStatement 2Y;iqR
PreparedStatement ps = cn.preparedStatement(sql); M{=p0?X
{ &$h#9
ps.setXXX(1,xxx); {>Qs+]
... COxJ,v(
ps.addBatch(); vCtnjWGX}/
} \.F|c
ps.executeBatch(); ;Wn0-`_1,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q 1A0-W#4
"rrE_
事务的处理 iE]^6i
1、关闭Connection的自动提交 I@1VX5
cn.setAutoCommit(false); :Yi 4Ia
2、执行一系列sql语句 H.O&seY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ir_X65l/2
Statement sm ; N`vPt?@
sm = cn.createStatement(insert into user...); mE9ytFH\k
sm.executeUpdate(); ~`0=-Qkd
sm.close(); dAaxbP|
sm = cn.createStatement("insert into corp...); uK[gI6M
sm.executeUpdate(); 2W/*1K}
sm.close(); l5U ^lc
3、提交 r90R~'5x9
cn.commit(); qIO)<5\[%d
4、如果发生异常,那么回滚 ;F/s!bupCM
cn.rollback();