java 数据库基本操作 Ikbz3]F^V
1、java数据库操作基本流程 !Qd4Y=
2、几个常用的重要技巧: lY_&P.B
可滚动、更新的记录集 ZZXQCP6]
批量更新 <O#/-r>2
事务处理 1]lm0bfs
|( =`l
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]/y&5X
1、取得数据库连接 3#@ETt0X(
1)用DriverManager取数据库连接 DMY?'Nts!
例子 "jyh.@<
String className,url,uid,pwd; 38hA guZX
className = "oracle.jdbc.driver.OracleDriver"; Im\{b=vT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; c>*RQ4vE
uid = "system"; @'yD(ZMAz
pwd = "manager"; Y=#g_(4*
Class.forName(className); s)~60c
Connection cn = DriverManager.getConnection(url,uid,pwd); '[h|f
2)用jndi(java的命名和目录服务)方式 X)K3X:~L+
例子 5YG?m{hyn_
String jndi = "jdbc/db"; f/:XIG
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =Qcz :ng
DataSource ds = (DataSource) ctx.lookup(jndi); {t;{={$
Connection cn = ds.getConnection(); b6k'`vLA
多用于jsp中 v!pT!(h4
2、执行sql语句 oKJj?%dHK9
1)用Statement来执行sql语句 PB :Lj
String sql; e Ert_@}
Statement sm = cn.createStatement(); K 8gd?88
sm.executeQuery(sql); // 执行数据查询语句(select) !PzlrH)M=p
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u!X$M?D4
2)用PreparedStatement来执行sql语句 4?AggqW
String sql; [ Yzh(a8
sql = "insert into user (id,name) values (?,?)"; coxMsDs
PreparedStatement ps = cn.prepareStatement(sql); #.(6.Li
ps.setInt(1,xxx); fdD?"z
ps.setString(2,xxx); U0+Hk+
... 5$e|@/(0
ResultSet rs = ps.executeQuery(); // 查询 s C9j73vf
int c = ps.executeUpdate(); // 更新 ]tVU$9D
tCk;tu!d
3、处理执行结果 ">G|\_ZF
查询语句,返回记录集ResultSet Vc!;O9dP
更新语句,返回数字,表示该更新影响的记录数 'j)xryw
ResultSet的方法 0.~Pzg
1、next(),将游标往后移动一行,如果成功返回true;否则返回false L{)e1 p]q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !6pOY*> j
FX FTf2*T
4、释放连接 }wh)I]]U
cn.close(); 62&(+'$n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ew=8"V`C
1r?<1vh:z
可滚动、更新的记录集 |8$x
1、创建可滚动、更新的Statement \S)\~>.`y!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); NY'sZTM&
该Statement取得的ResultSet就是可滚动的 (o1*7_]e
2、创建PreparedStatement时指定参数 S3[rv
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +oZq~2?*S6
ResultSet.absolute(9000); K.Tfu"6
批量更新 .O{2]e$
1、Statement LsnM5GU7
Statement sm = cn.createStatement(); z\,g %u41
sm.addBatch(sql1); _(}{=:M?
sm.addBatch(sql2); 99@uU[&IJ
... ^1vh5D
sm.executeBatch() 1@)8E`u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M%dXy^e
2、PreparedStatement JRkC~fv
PreparedStatement ps = cn.preparedStatement(sql); Y{TzN%|LV
{ m
?a&XZ
ps.setXXX(1,xxx); Uj)~ >V'
... &k
/uR;yw
ps.addBatch(); XHgwK@GU
} 1Z?en
ps.executeBatch(); :h
tOz.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 P"J(O<(1-:
'b#`8k~>
事务的处理 ysV0Ed
1、关闭Connection的自动提交 k[]B
P4
cn.setAutoCommit(false); %X Jv;|
2、执行一系列sql语句 L\Uf+d:&}G
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !F*7Mif_E
Statement sm ; y]B?{m``6
sm = cn.createStatement(insert into user...); gRS}Y8
sm.executeUpdate(); ){|Bh3XV
sm.close(); *.0}3
sm = cn.createStatement("insert into corp...); GqXnOmk
sm.executeUpdate(); {H+~4XG
sm.close(); >;eWgQ6V
3、提交 J#7\R':}zl
cn.commit(); 'ao<gTUbu
4、如果发生异常,那么回滚 (PjC]`FK
cn.rollback();