java 数据库基本操作 "4Wp>B
1、java数据库操作基本流程 \E ? iw.}
2、几个常用的重要技巧: C7XS6Nqu
可滚动、更新的记录集 !#_h2a
批量更新 o|p;6
事务处理 KV)Hywl`
mTI\,x%<OC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $)kBz*C[
1、取得数据库连接 #NVF\
1)用DriverManager取数据库连接 =: v><
例子 VDb,$i.Z0
String className,url,uid,pwd; ~|0F?~eR7
className = "oracle.jdbc.driver.OracleDriver"; T9U2j-lA?
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QTrlQH&p
uid = "system"; 3& fIO
pwd = "manager"; /z.7:<gZ(
Class.forName(className); {8*d;[X50
Connection cn = DriverManager.getConnection(url,uid,pwd); 'Z(MV&
2)用jndi(java的命名和目录服务)方式 Npf7 p
例子 5* o\z&*L
String jndi = "jdbc/db"; T?p`Y| gl
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); e!2%k u
DataSource ds = (DataSource) ctx.lookup(jndi); Wzf1-0t
Connection cn = ds.getConnection(); f3%^-Uy*b
多用于jsp中 S,)|~#5x
2、执行sql语句 ` + n
1)用Statement来执行sql语句 Zh fD`@>&
String sql; 6Mf3)o2
Statement sm = cn.createStatement(); fa*H cz
sm.executeQuery(sql); // 执行数据查询语句(select) Ndug9j\2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a2klOX{
2)用PreparedStatement来执行sql语句 qk+{S[2j
String sql; HqnKpZ
sql = "insert into user (id,name) values (?,?)"; F`ZIc7(.{
PreparedStatement ps = cn.prepareStatement(sql); #?b^B~ #
ps.setInt(1,xxx); '%]@a7w
ps.setString(2,xxx); Ql6ai
... h3;o!FF
ResultSet rs = ps.executeQuery(); // 查询 CL@h!h554_
int c = ps.executeUpdate(); // 更新 bsk=9K2_2t
+=B}R
3、处理执行结果 sP3.s_U^
查询语句,返回记录集ResultSet yV+ E;
更新语句,返回数字,表示该更新影响的记录数 PhI6dB`
ResultSet的方法 jhEg#Q$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Jq+$_Uqd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &Lt$a_y>
Rm\'];
4、释放连接 5?~[|iPv
cn.close(); 4htSwK+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ==jw3_W
L/iVs`qF
可滚动、更新的记录集 _{Q?VQvZ
1、创建可滚动、更新的Statement mJDKxgGK
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :C:N]6_{SZ
该Statement取得的ResultSet就是可滚动的 >$S,>d_k`
2、创建PreparedStatement时指定参数 ,O&PLr8cJ?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^ yukn*L
ResultSet.absolute(9000); vX0I^8.
批量更新 )T};Q:
1、Statement cLyuCaH>c
Statement sm = cn.createStatement(); ]htZ!; 8J
sm.addBatch(sql1); Vw;ldEdx
sm.addBatch(sql2); V.gY1
... @;n$ caw
sm.executeBatch() VgZaDd;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EDidg"0p
2、PreparedStatement 64\5v?C
PreparedStatement ps = cn.preparedStatement(sql); 8$<AxNR
{ D>7_P7]y
ps.setXXX(1,xxx); )D@n?qbG
... `F+x]<m!
ps.addBatch(); ssJDaf79
} g=YiR/O1QN
ps.executeBatch(); zyp"*0zUr
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 W6xjqNU
#L IsL
事务的处理 k'I_,Z<,
1、关闭Connection的自动提交 /E4 }d=5L
cn.setAutoCommit(false); Z/05 wB
2、执行一系列sql语句 3Gd&=IJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close R,5$ 0_]|+
Statement sm ; (~pEro]?+)
sm = cn.createStatement(insert into user...); , w'$T)
sm.executeUpdate(); ~h^}W$pO
sm.close(); ?.Yw%{?TG
sm = cn.createStatement("insert into corp...); ;`PkmAg
sm.executeUpdate(); ,nChwEn
sm.close(); `)C`_g3Ew
3、提交 CpqSn/
cn.commit(); $-9@ /%Y
4、如果发生异常,那么回滚 v.2Vg
cn.rollback();