java 数据库基本操作 g=I})s:CTp
1、java数据库操作基本流程 GKCroyor
2、几个常用的重要技巧: 2"~8Z(0
可滚动、更新的记录集 :Qq#Z
批量更新 }1xo-mUg,
事务处理 ?fS9J
^C%<l(b
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ctV,Q3'Z
1、取得数据库连接 QCJM&
1)用DriverManager取数据库连接 I?NyM
例子 DL.!G
String className,url,uid,pwd; 'f|o{
className = "oracle.jdbc.driver.OracleDriver"; 3M=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /7LR;>B j
uid = "system"; -^wl>}#*T3
pwd = "manager"; uIrG* K
Class.forName(className); |&jXp%4T
Connection cn = DriverManager.getConnection(url,uid,pwd); w=@Dv
2)用jndi(java的命名和目录服务)方式 YoE3<[KD(
例子 eiOW#_"\
String jndi = "jdbc/db"; 9ll~~zF99|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "ITIhnE
DataSource ds = (DataSource) ctx.lookup(jndi); 5(8@%6>ruj
Connection cn = ds.getConnection(); Ct|A:/z(
多用于jsp中 _aMF?Pj~m
2、执行sql语句 GJUL$9
1)用Statement来执行sql语句 FgI3
String sql; l+0P
Statement sm = cn.createStatement(); ?hM64jI|
sm.executeQuery(sql); // 执行数据查询语句(select) (I}v[W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); s(8W_4&'
2)用PreparedStatement来执行sql语句 Qei"'~1a
String sql; (9h`3#
sql = "insert into user (id,name) values (?,?)"; &~w}_Fjk
PreparedStatement ps = cn.prepareStatement(sql); BluVmM3Vj
ps.setInt(1,xxx); 9{uO1O\
ps.setString(2,xxx); E!AE4B1bd
... u]gxFG"
ResultSet rs = ps.executeQuery(); // 查询 u2[w#
int c = ps.executeUpdate(); // 更新 kNL\m[W8$
{y;n:^
3、处理执行结果 4`R(?
查询语句,返回记录集ResultSet _tXlF;
更新语句,返回数字,表示该更新影响的记录数 %%wNZ{
ResultSet的方法 *9i{,I@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |WUG}G")*x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 s9d_GhT%-
L_s:l9!r
4、释放连接 uwBiW
cn.close(); IIqUZJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &"q=5e2
Q5_o/wk
可滚动、更新的记录集 lNBL4yM
1、创建可滚动、更新的Statement M#[{>6>iE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6`-jPR
该Statement取得的ResultSet就是可滚动的 ,?XCyHSgWW
2、创建PreparedStatement时指定参数 bYPK h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'Z |mQZN
ResultSet.absolute(9000); ctJE+1#PH
批量更新 8sCv]|cn
1、Statement sT' 5%4
Statement sm = cn.createStatement(); ]0\MmAJRn
sm.addBatch(sql1); O| hpXkV
sm.addBatch(sql2); t()c=8qF|u
... r"R#@V\'1b
sm.executeBatch() ri.I pRe
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 188*XCtjQ9
2、PreparedStatement as_PoCoss
PreparedStatement ps = cn.preparedStatement(sql); 8e|%M
{ ;({W#Wa
ps.setXXX(1,xxx); !?gKqx'T$
... <"|,"hA
ps.addBatch(); /FJu)H..U
} tnG# IU
*
ps.executeBatch(); k@:%:Sj 2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 w1DV\Ap*
0K2`-mL
事务的处理 ""|Qtubv
1、关闭Connection的自动提交 *=c1do%F
cn.setAutoCommit(false); @|%2f@h
2、执行一系列sql语句 !GGkdg*-*9
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Qz
N&>sk"
Statement sm ; uRr o?m<
sm = cn.createStatement(insert into user...); Ez=Olbk
sm.executeUpdate(); J9[r|`gJ(
sm.close(); Y.r+wc]
sm = cn.createStatement("insert into corp...);
(ICd}
sm.executeUpdate(); {8%a5DiM
sm.close(); ox (%5c)b|
3、提交 /~f'}]W
cn.commit(); g'qa}/X
4、如果发生异常,那么回滚 [1
9,&]z
cn.rollback();