java 数据库基本操作 @98;VWY\
1、java数据库操作基本流程 ~2}Pl)
2、几个常用的重要技巧: ,krS-.
可滚动、更新的记录集 ND]S(C"?
批量更新 Dk)}|GJ()"
事务处理 =WZ%H_oxi
6k0^ x Q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 % +Pl+`?E
1、取得数据库连接 vS;'}N
1)用DriverManager取数据库连接 VC&c)X
例子 ^tAO_~4
String className,url,uid,pwd; AY2:[ 5cm
className = "oracle.jdbc.driver.OracleDriver"; Fxd{ Zk`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; zok D:c
uid = "system"; t\y-T$\\
pwd = "manager"; v#w _eqg
Class.forName(className); S)\8|ym6!
Connection cn = DriverManager.getConnection(url,uid,pwd); A=3HO\n5
2)用jndi(java的命名和目录服务)方式 a<Uqyilm
例子 9w^zY;Y
String jndi = "jdbc/db"; - V) R<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3P=w =~e
DataSource ds = (DataSource) ctx.lookup(jndi); z_SagU,\
Connection cn = ds.getConnection(); =G>(~+EA
多用于jsp中 $3
8gs{+
2、执行sql语句 2hOPzv&B
1)用Statement来执行sql语句 ]
pPz@@xx
String sql; /)#8)"`nT
Statement sm = cn.createStatement(); ziL^M"~2
sm.executeQuery(sql); // 执行数据查询语句(select) L@)&vn]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <)#kq1b?
2)用PreparedStatement来执行sql语句 %]4-{%v
String sql; \ElX~$fS
sql = "insert into user (id,name) values (?,?)"; 1M5 -pZ[D
PreparedStatement ps = cn.prepareStatement(sql); Y(i?M~3\t
ps.setInt(1,xxx); r'aY2n^O
ps.setString(2,xxx); UVX"fZ)
...
IsYP0(L
ResultSet rs = ps.executeQuery(); // 查询 3B9nP._
int c = ps.executeUpdate(); // 更新 c?6d2jH.
Q_P5MLU>
3、处理执行结果 L7q | ^`
查询语句,返回记录集ResultSet }5gr5g\OtP
更新语句,返回数字,表示该更新影响的记录数 _vrWj<wyf
ResultSet的方法 w=J4zkWk
1、next(),将游标往后移动一行,如果成功返回true;否则返回false T%I&txl
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RsSXhPk?
|O (G nsZ
4、释放连接 xb^Mo.\[
cn.close(); y4F^|kS) [
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection gg]~2f
-J$g(sikt
可滚动、更新的记录集 7kz-V.
1、创建可滚动、更新的Statement 960qvz!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); HHS45kg[c
该Statement取得的ResultSet就是可滚动的 K5flit4-
2、创建PreparedStatement时指定参数 1j3=o }m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +WF.wP?y
ResultSet.absolute(9000); 0=[0|`x
批量更新 Y6eEGo"K.+
1、Statement S<oQ}+4[~
Statement sm = cn.createStatement(); iHz[Zw^.s
sm.addBatch(sql1); hx!`F
sm.addBatch(sql2); Nlt4)
... YFx=b!/s
sm.executeBatch() :XS"#^aJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Dd/}Ya(Gi
2、PreparedStatement \Hum }0[
PreparedStatement ps = cn.preparedStatement(sql); lO2k<
{ zqGYOm$r
ps.setXXX(1,xxx); |=3 *;}
... ;nk@XFJ
ps.addBatch(); |~NeB"l{
} X<xqT
ps.executeBatch(); 878tI3-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h)o]TV
u2lmwE
事务的处理 *Q/E~4AW|t
1、关闭Connection的自动提交 .BL:h&h|y
cn.setAutoCommit(false); raQYn?[
2、执行一系列sql语句 w-:
D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .
bG{T|
Statement sm ; %FS;>;i?
sm = cn.createStatement(insert into user...); */U$sZQ)
sm.executeUpdate(); 6y@<?08Q
sm.close(); iEhDaC[e(b
sm = cn.createStatement("insert into corp...); Yq;&F0paK
sm.executeUpdate(); MVAc8d S
sm.close(); ,k%8yK
3、提交 nHU3%%%cU
cn.commit(); Y n>{4BZ>#
4、如果发生异常,那么回滚 4TJ!jDkox
cn.rollback();