java 数据库基本操作 BUKh5L
1、java数据库操作基本流程 w3IU'(|G
2、几个常用的重要技巧: T1b9Zqc)f
可滚动、更新的记录集 k@R)_,2HH
批量更新 `Tf<w+H
事务处理 D&)gcO`\
^coJ"[D
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iNs
1、取得数据库连接 hAZ"M:f
1)用DriverManager取数据库连接 7"
cgj#
例子 RT2a:3f
String className,url,uid,pwd; dQFx]p3L
className = "oracle.jdbc.driver.OracleDriver"; $}7WJz:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; KH&xu,I
uid = "system"; 2?7a\s
pwd = "manager"; C44Dz.rs
Class.forName(className); l>9ZAI\^
Connection cn = DriverManager.getConnection(url,uid,pwd); m;LeaD}0
2)用jndi(java的命名和目录服务)方式 P3YG:*
例子 bsmnh_YRj
String jndi = "jdbc/db"; Om2
)$(
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); L7*~8Y
DataSource ds = (DataSource) ctx.lookup(jndi); BT+ws@|[
Connection cn = ds.getConnection(); 'x10\Q65[
多用于jsp中 \bb,gRfP
2、执行sql语句 !$+J7\&7p
1)用Statement来执行sql语句 dDk<J;~jGJ
String sql; Lp/]iZ@
Statement sm = cn.createStatement(); 7QRtNYo#\
sm.executeQuery(sql); // 执行数据查询语句(select) {ByT,92
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); VL<)d-
2)用PreparedStatement来执行sql语句 IV:Knh+
?
String sql; ji2if.t@
sql = "insert into user (id,name) values (?,?)"; G>{;@u
PreparedStatement ps = cn.prepareStatement(sql); Rf\>bI<.
ps.setInt(1,xxx); A!
1>
ps.setString(2,xxx); Hp":r%)
... NLF{W|X
ResultSet rs = ps.executeQuery(); // 查询 |^@TA=_
int c = ps.executeUpdate(); // 更新 o0Hh&:6!M
L+QEFQ:r5
3、处理执行结果 $y> J=
查询语句,返回记录集ResultSet r jL%M';
更新语句,返回数字,表示该更新影响的记录数 ,k@fXoW
ResultSet的方法 Nr7MSFiL
1、next(),将游标往后移动一行,如果成功返回true;否则返回false p<6pmW3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 z{^XU"yB
1}!f.cWV(
4、释放连接 =RUKN38
cn.close(); 0:nQGX!N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection v1zJr6ra9
(85F1"Jp
可滚动、更新的记录集 <OW` )0UX
1、创建可滚动、更新的Statement n4CzReG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7z6y n=B
该Statement取得的ResultSet就是可滚动的 c{#lKD<7
2、创建PreparedStatement时指定参数 82Vxk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eA_1?j]E3
ResultSet.absolute(9000); <
v_ ?}
批量更新 3!CI=(^IY
1、Statement GI7CZ
Statement sm = cn.createStatement(); A HKS
[ N
sm.addBatch(sql1); B69 NL
sm.addBatch(sql2); ]]%CO$`T[
... fi#o>tVyJ
sm.executeBatch() 4(YKwY2_L
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^ tm,gh
2、PreparedStatement R{6.O+j`
PreparedStatement ps = cn.preparedStatement(sql); oc-7gz)
{ <<&:BK
ps.setXXX(1,xxx); S3j/(BG
... M* QqiE
ps.addBatch(); kAbT&Rm"
} FAU^(]-5m
ps.executeBatch(); ;Z.}~d6>!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F+L q
g >-iBxml
事务的处理 K#F~$k|1B
1、关闭Connection的自动提交 z6FG^
cn.setAutoCommit(false); Jp5~iC2d
2、执行一系列sql语句 S`X;2\:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X'[SCs
Statement sm ; 1/w['d4l!
sm = cn.createStatement(insert into user...); XX}RbE#4
sm.executeUpdate(); }
"y{d@
sm.close(); 94|BSxc
sm = cn.createStatement("insert into corp...); n&[U/`o
sm.executeUpdate(); -_pI:K[
sm.close(); m2<sVTN`^
3、提交 )X| uOg&|
cn.commit(); w>VM--
4、如果发生异常,那么回滚 -oe&1RrdVg
cn.rollback();