java 数据库基本操作 i~AReJxt7
1、java数据库操作基本流程 %rgW}Z5
2、几个常用的重要技巧: )v11j.D
可滚动、更新的记录集 ms!|a_H7r
批量更新 ywkRH
事务处理 qJf\,7mi
h{H*k#>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .p*?g;
1、取得数据库连接 @$ju Qm
1)用DriverManager取数据库连接 |Ldvfd
例子 qX; F+~
String className,url,uid,pwd; l(-"rE
className = "oracle.jdbc.driver.OracleDriver"; `@WJ_-$#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g]c6_DMfb1
uid = "system"; $o;c:Kh$$
pwd = "manager"; D^V)$ME
Class.forName(className); '-J<ib
t
Connection cn = DriverManager.getConnection(url,uid,pwd); r:g_mMvB
2)用jndi(java的命名和目录服务)方式 '?Q"[e
例子 &['x+vL9
String jndi = "jdbc/db"; ~iQBgd@D^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }@ktAt
DataSource ds = (DataSource) ctx.lookup(jndi); 1|!)*!hu
Connection cn = ds.getConnection(); %l#X6jkt
多用于jsp中 P,a9B2
2、执行sql语句 om9'A=ZU
1)用Statement来执行sql语句 e=s85!
String sql; &zJ\D`\,O
Statement sm = cn.createStatement(); dFhyT.Y?
sm.executeQuery(sql); // 执行数据查询语句(select) m[iQ7/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); md?
cvGDE
2)用PreparedStatement来执行sql语句 #qR 6TM&;
String sql; #$W0%7
sql = "insert into user (id,name) values (?,?)"; l
9g
PreparedStatement ps = cn.prepareStatement(sql); 'RF`XX
ps.setInt(1,xxx); @V:Y%#%
ps.setString(2,xxx); c0rU&+:Ry
... ~:U`^wtQ
ResultSet rs = ps.executeQuery(); // 查询 -Ah&|!/
int c = ps.executeUpdate(); // 更新 DpQWh+WRy
O^ui+44wp
3、处理执行结果 Xdl
dUK[
查询语句,返回记录集ResultSet t+q;}ZvG
更新语句,返回数字,表示该更新影响的记录数 ;hV|W{=w
ResultSet的方法 MEJX5qG6m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Lccy~2v>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *RVCz|0%w
*5*#Z~dut8
4、释放连接 W[qy4\.B
cn.close(); rFkZ'rp74b
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /V`SJ"
L6i|5 P
可滚动、更新的记录集 k~K;r8D/
1、创建可滚动、更新的Statement `Mbs6AJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ($/l_F
该Statement取得的ResultSet就是可滚动的 sQ^t8Y9
2、创建PreparedStatement时指定参数 XEagN:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x-ue1
ResultSet.absolute(9000); aPK:k$.
批量更新 :8@eon}
1、Statement frDMFEXXP
Statement sm = cn.createStatement(); <y~Ba@1u
sm.addBatch(sql1); ~m,~;
sm.addBatch(sql2); h(~/JW[
... )"hd"
sm.executeBatch() QRrAyRf[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %8%|6^,
2、PreparedStatement %#~wFW|]x
PreparedStatement ps = cn.preparedStatement(sql); r\F2X J^
{ $F9w0kz:,*
ps.setXXX(1,xxx); i=]R1yP
... .-mIU.Nwi
ps.addBatch(); DO~[VK%|
} j[FB*L1!D
ps.executeBatch(); b]Kb ~y|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 9L3P'!Z
~o|sm a5.
事务的处理 o@_i&4[MW
1、关闭Connection的自动提交 ]B3+&g
cn.setAutoCommit(false); 5@
td0
2、执行一系列sql语句 :t9![y[=|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close t']/2m.&p
Statement sm ; ^ <`SUBI
sm = cn.createStatement(insert into user...); (Fuu V{x|
sm.executeUpdate(); TOKt{`2}
sm.close(); _e;bB?S
sm = cn.createStatement("insert into corp...); *i#N50k*j'
sm.executeUpdate(); 67&Q<`V1*q
sm.close(); DNqV]N_W
3、提交 )V>zXy}Y
cn.commit(); ~n) |
4、如果发生异常,那么回滚 ::iYydpM
cn.rollback();