java 数据库基本操作 H=Y{rq @
1、java数据库操作基本流程 lJis~JLd`
2、几个常用的重要技巧: bS"fkf9
可滚动、更新的记录集 obNqsyc77R
批量更新 p|&Yku=
事务处理 /5:bvg+
g#t[LI9(F[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }7
c[Q($K
1、取得数据库连接 \V*xWS
1)用DriverManager取数据库连接 b+&%1C
例子 |qmu_x\
String className,url,uid,pwd; gm[z[~X@
className = "oracle.jdbc.driver.OracleDriver"; i* NH'o/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Y[K*57fs
uid = "system"; fvF?{k> ~}
pwd = "manager"; ( 8c9 /7h
Class.forName(className); /|eA9 ]
Connection cn = DriverManager.getConnection(url,uid,pwd); jg\Z;_!W
2)用jndi(java的命名和目录服务)方式 twlk-2yT!
例子 ; o0&`b?
String jndi = "jdbc/db"; oWC@w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D(H>R&b!
DataSource ds = (DataSource) ctx.lookup(jndi); &qr;IL7'
Connection cn = ds.getConnection(); TG+VEL |T
多用于jsp中 Ndcg/d
2、执行sql语句 B9H@e#[
1)用Statement来执行sql语句 li 6%)
String sql; @qnD=mE
Statement sm = cn.createStatement(); JAX*hGhkh
sm.executeQuery(sql); // 执行数据查询语句(select) A?t%e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); x*nSHb
2)用PreparedStatement来执行sql语句 !qN||mCH
String sql; "G@g" gP
sql = "insert into user (id,name) values (?,?)"; mM-8+H?~b
PreparedStatement ps = cn.prepareStatement(sql); ktdW`R\+
ps.setInt(1,xxx); @p NNq
ps.setString(2,xxx); X7i/fm{l'
... kT!9`S\
ResultSet rs = ps.executeQuery(); // 查询 pFHz"]
int c = ps.executeUpdate(); // 更新 9uBM<
~(IB0=A{v
3、处理执行结果 i2&ed_h<?
查询语句,返回记录集ResultSet _cJ2\`M
更新语句,返回数字,表示该更新影响的记录数 -cSP_1
ResultSet的方法 LM-J !44
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hijgF@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
GrAujc5|
pn.T~"%
4、释放连接 4W)B'+ZK8
cn.close(); )l[M
Q4vWW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $a"n1ou
|Clut~G
可滚动、更新的记录集 m$W <
1、创建可滚动、更新的Statement %d(^d
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g47-db"5
该Statement取得的ResultSet就是可滚动的 3MY(<TGX
2、创建PreparedStatement时指定参数 [h34d5'w
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); n>^Y$yy}!
ResultSet.absolute(9000); -:Ia^{YN
批量更新 JA'h4AXk
1、Statement ( 2n>A D_
Statement sm = cn.createStatement(); q&/Yg,p\
sm.addBatch(sql1); Qkd<sxL
sm.addBatch(sql2); mqAWL:VvQ7
... !>e5z|1
sm.executeBatch() ghX|3lI\q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 , 'ZD=4_
2、PreparedStatement OQ>x5?um
PreparedStatement ps = cn.preparedStatement(sql); OZTPOz.
{ dUF&."pW e
ps.setXXX(1,xxx); w[!^;#
... bVL9vNK
ps.addBatch(); 2#<xAR
} I*IhwJFl/
ps.executeBatch(); vt;{9\Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =}v}my3y"
OV%Q3$15
事务的处理 -R%<.]fJ
1、关闭Connection的自动提交 S`"LV $8
cn.setAutoCommit(false); y7$iOR
2、执行一系列sql语句 z(fAnn
T?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close z-LB^kc8oQ
Statement sm ; f"9q^
sm = cn.createStatement(insert into user...); @W^| ?
sm.executeUpdate(); ;3kj2}
sm.close(); =ZDAeVz3w
sm = cn.createStatement("insert into corp...); N^pJS6cJkl
sm.executeUpdate(); $P(v{W)
sm.close(); "ajjJ"x A
3、提交 '{J&M|<A
cn.commit(); -Y*bSP)\
4、如果发生异常,那么回滚 +[R/=$
cn.rollback();