java 数据库基本操作 @^8tk3$Y
1、java数据库操作基本流程 8A{n9>jrb
2、几个常用的重要技巧: (9hCO-r
可滚动、更新的记录集 (0jT#&#
批量更新 D"^4X'6
事务处理 b4GD}kR
%xtTh]s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7e\g
1、取得数据库连接 XUT,)dL
1)用DriverManager取数据库连接 E5D5
例子 (H/JB\~r
String className,url,uid,pwd; pi)7R:i
className = "oracle.jdbc.driver.OracleDriver"; PtySPDClj
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %N#8D<ULd
uid = "system"; Ek|#P{!
pwd = "manager"; >p4#AfGF
Class.forName(className); x8I=I"Sp
Connection cn = DriverManager.getConnection(url,uid,pwd); 4LqJ4jo
2)用jndi(java的命名和目录服务)方式 ?-CZJr
例子 ',L>UIXw
String jndi = "jdbc/db"; 0e1W&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); SoZ$1$o2
DataSource ds = (DataSource) ctx.lookup(jndi); Mg?^ 5`*
Connection cn = ds.getConnection(); cn&\q.!fh
多用于jsp中 ]~g6#@l
2、执行sql语句 J%d\ 7
1)用Statement来执行sql语句 BdcTKC
String sql; QeP8Vl&e:
Statement sm = cn.createStatement(); zPWX%1Qr
sm.executeQuery(sql); // 执行数据查询语句(select) C$o#zu q-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ydo"H9NOS
2)用PreparedStatement来执行sql语句 qgd#BJ=
String sql; R)% Jr.U
sql = "insert into user (id,name) values (?,?)"; /QDlm>FM4
PreparedStatement ps = cn.prepareStatement(sql); 5$o]D
ps.setInt(1,xxx); s@^(1g[w`
ps.setString(2,xxx); f/t1@d!
... 2P9gS[Ub
ResultSet rs = ps.executeQuery(); // 查询 &WN#HI."]
int c = ps.executeUpdate(); // 更新 Vb>!;C
c , a+u
3、处理执行结果 0j*-ZvE)30
查询语句,返回记录集ResultSet N*6Y5[g!\
更新语句,返回数字,表示该更新影响的记录数 bF:]MB^VK
ResultSet的方法 |=H*" (
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >Q&E4j C
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \ .HX7v
<}S1ZEZcQ
4、释放连接 B{'x2I#,
cn.close(); 5y07@x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YEF|SEon0
_:ypPRJ
可滚动、更新的记录集 R/8>^6
1、创建可滚动、更新的Statement ("(:wYR%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >%jQw.
该Statement取得的ResultSet就是可滚动的 d#yb($HAJ
2、创建PreparedStatement时指定参数 MxMrLiqU6l
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); / sI0{
ResultSet.absolute(9000); B0Ql1x#x
批量更新 C%8nr8po
1、Statement >5C|i-HX
Statement sm = cn.createStatement(); EsR_J/:Qe
sm.addBatch(sql1); U 2k^X=yl
sm.addBatch(sql2); ~A<1xszC
... b|F_]i T
sm.executeBatch() S2nF13u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sM)qzO2wh
2、PreparedStatement :#8#tLv
PreparedStatement ps = cn.preparedStatement(sql); ~~eR,HYk
{ &9bsTm
ps.setXXX(1,xxx); z(]14250
... X2b<_j3
ps.addBatch(); A<ca9g3
} 6.? Ke8iC
ps.executeBatch(); dKyJ.p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 MONfA;64/
8z&7wO
事务的处理 b e[KNrO
1、关闭Connection的自动提交 ~ _C[~-
cn.setAutoCommit(false); S#+Dfa`8X
2、执行一系列sql语句 O>e2MT|#k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o.yuz+
Statement sm ; fY3^L"R
sm = cn.createStatement(insert into user...); ;WX)g&19x
sm.executeUpdate(); L{fKZ
sm.close(); mY9^W2:
sm = cn.createStatement("insert into corp...); t,$4J6
sm.executeUpdate(); vt0XCUnK
sm.close(); {KJ !rT
3、提交 6 R}]RuFQ
cn.commit(); JSXudz5c
4、如果发生异常,那么回滚 HO ,z[6
cn.rollback();