java 数据库基本操作 E /<lGm:.
1、java数据库操作基本流程 3251Vq %
2、几个常用的重要技巧: kGYTl,A{
可滚动、更新的记录集 tln37vq
批量更新 5]Ajf;W\
事务处理 $&I'o
-7qIToO.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 fz_nsVD
1、取得数据库连接
ZI>km?w
1)用DriverManager取数据库连接 Q;/a F`
例子 KA s 1(oG
String className,url,uid,pwd; \3YO<E!t
className = "oracle.jdbc.driver.OracleDriver"; (g!p>m!Z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8MwK.H[U
uid = "system"; ts~{w;c
pwd = "manager"; [1G^/K"
Class.forName(className);
#/S
{6c
Connection cn = DriverManager.getConnection(url,uid,pwd); gXFWxT8S
2)用jndi(java的命名和目录服务)方式 cI0 ]}S
例子 vb{i
String jndi = "jdbc/db"; r#i?j}F}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :;]Oc
DataSource ds = (DataSource) ctx.lookup(jndi); P\2M[Gu(Q
Connection cn = ds.getConnection();
#;KsJb)N.
多用于jsp中 oA-:zz>wL
2、执行sql语句 #\rwLpC1u
1)用Statement来执行sql语句 X@2-*so<
String sql; J;Rv ~<7
Statement sm = cn.createStatement(); Zo-$z8
sm.executeQuery(sql); // 执行数据查询语句(select) \E1U@6a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,L>
ar)B
2)用PreparedStatement来执行sql语句 7;:#;YSha
String sql; ^rNUAj9Z
sql = "insert into user (id,name) values (?,?)"; p*QKK@C
PreparedStatement ps = cn.prepareStatement(sql); j{++6<tr
ps.setInt(1,xxx); ?X$,fQ#F|
ps.setString(2,xxx); y2L#:[8
... }ut]\]b
ResultSet rs = ps.executeQuery(); // 查询 <U Zd;e@
int c = ps.executeUpdate(); // 更新 m` AK~O2
D=f7NVc >Q
3、处理执行结果 {}~: &.D
查询语句,返回记录集ResultSet YvL?j
更新语句,返回数字,表示该更新影响的记录数 /7c~nBU
ResultSet的方法 $rB3m~c|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :*514N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]jMKC8uz
tl yJmdl
4、释放连接 T.e.{yO
cn.close(); [IZM.r`Z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection x[_=#8~.1x
| s+0~$O;
可滚动、更新的记录集 IIFMYl gF
1、创建可滚动、更新的Statement Y,S\2or$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )=pD%$iq
该Statement取得的ResultSet就是可滚动的 OTWkUB{
2、创建PreparedStatement时指定参数 KxGX\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {2d_"lHBt
ResultSet.absolute(9000); vT^Sk;E
批量更新 Sb2v_o
1、Statement w0m^ &,;#
Statement sm = cn.createStatement(); @exey
sm.addBatch(sql1); gJN0!N'
sm.addBatch(sql2); {^)70Vz>PE
... Pn.bVV:
sm.executeBatch() K+\nC)oG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 AEirj /
2、PreparedStatement 3L>IX8_
PreparedStatement ps = cn.preparedStatement(sql); '_s}o<
{ {Bvj"mL]j
ps.setXXX(1,xxx); ,Z9>h[JF
... iOw3MfO
ps.addBatch(); *hhmTc#
} /hW d/H]
ps.executeBatch(); !\ND(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,Dmc2D
]:]H:U]p
事务的处理 +]xFoH
1、关闭Connection的自动提交 )P&9A)8
cn.setAutoCommit(false); y8Xv~4qQW
2、执行一系列sql语句 5i6
hp;=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >T3H qYX5W
Statement sm ; &Nl2sey
sm = cn.createStatement(insert into user...); \5
pu|2u
sm.executeUpdate(); Fe&qwq"
sm.close(); +YY8h>hj
sm = cn.createStatement("insert into corp...); zR6siAV9
sm.executeUpdate(); qZk'tRv
sm.close(); @ T;L$x
3、提交 fG LG$b
cn.commit(); @~
Dh'w2q
4、如果发生异常,那么回滚 D0G-5}s`
cn.rollback();