java 数据库基本操作 }#EiL
!Pv
1、java数据库操作基本流程 RS<c&{?
2、几个常用的重要技巧: X-oou'4<
可滚动、更新的记录集 3{d1Jk/S
批量更新 RXl52#:
事务处理 X@af[J[cQ
4(u+YW GX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 X[NsdD?w1+
1、取得数据库连接 kfm8F8sxl
1)用DriverManager取数据库连接 L-@j9hU{
例子 6n%^
U2H/-
String className,url,uid,pwd; "M_X9n_
className = "oracle.jdbc.driver.OracleDriver"; ~O@V;y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; o~<fw]y
uid = "system"; oc\rQ?
pwd = "manager"; }4_izKS
Class.forName(className); 7i334iQZ
Connection cn = DriverManager.getConnection(url,uid,pwd); te" 8ZmJ
2)用jndi(java的命名和目录服务)方式 a4g=cs<9}
例子 vWe)c J
String jndi = "jdbc/db";
8EbYk2j
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _~Lhc'^p*
DataSource ds = (DataSource) ctx.lookup(jndi); s}`=pk/FM
Connection cn = ds.getConnection(); OX|/yw8
多用于jsp中 Eto0>YyZ
2、执行sql语句 4vBZb^W;9
1)用Statement来执行sql语句 Z9=Cw0( w?
String sql; Lk#u^|Eq7=
Statement sm = cn.createStatement(); Xb$)}n\9
sm.executeQuery(sql); // 执行数据查询语句(select) ~+3f8%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6<]&T lS]
2)用PreparedStatement来执行sql语句 <MvFAuAT
String sql; f_D1zU^
sql = "insert into user (id,name) values (?,?)"; /,E%)K;
PreparedStatement ps = cn.prepareStatement(sql); 6sQ"go$}
ps.setInt(1,xxx); QnaMjDh$6
ps.setString(2,xxx); <Er|s^C
... -BQM i0
ResultSet rs = ps.executeQuery(); // 查询 (zJ
TBI'
int c = ps.executeUpdate(); // 更新 x-y=Jor
QhpE 2ICU
3、处理执行结果 Z?"Pkc.Ei
查询语句,返回记录集ResultSet 3gv>AgG
更新语句,返回数字,表示该更新影响的记录数 eg?vYW
ResultSet的方法 jn)~@~c
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m]7yc>uDy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 CzNSJVE5
PcUi+[s;x
4、释放连接 P>4(+s
cn.close(); >L&>B5)9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nfrC@Av
C@]Z&H;
可滚动、更新的记录集 1|z>}
xP
1、创建可滚动、更新的Statement ut-UTW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); gyI5;il~
该Statement取得的ResultSet就是可滚动的 [2)Y0; ["
2、创建PreparedStatement时指定参数 !i)?j@D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qMI%=@=
ResultSet.absolute(9000); tV#x{DN
批量更新 I!# 42~\
1、Statement Gt6$@ji4u
Statement sm = cn.createStatement(); V-7!)&q
sm.addBatch(sql1); <FGNV+?%e
sm.addBatch(sql2); R['qBHQ?
... +(cs,?`\
sm.executeBatch() TmzEZ<} &7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
x,>@IEN7
2、PreparedStatement zpg*hlv
PreparedStatement ps = cn.preparedStatement(sql); 9-bDgzk
{ #<v3G)|aS
ps.setXXX(1,xxx); uERc\TZ
... ]dk~C?H
ps.addBatch(); lW^RwNcd
} _5.7HEw>/
ps.executeBatch(); YM1@B`yWE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s{IycTbz
)5&w
事务的处理 l)XzU&Sc~
1、关闭Connection的自动提交 EkOBI[`
cn.setAutoCommit(false); ~2rZL
2、执行一系列sql语句 ?LvZEiJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close HK:?Y[ebs
Statement sm ; T:na\y/{j
sm = cn.createStatement(insert into user...); GbStqR~^#
sm.executeUpdate(); W J^r~*r
sm.close(); bhuA,}
sm = cn.createStatement("insert into corp...); 4\Q ?4ZX
sm.executeUpdate(); ']}ZI 8
sm.close(); aQinR"o
3、提交 g w}t.3}
cn.commit(); +uv]dD*i
4、如果发生异常,那么回滚 70|Cn(p_
cn.rollback();