java 数据库基本操作 {C'9?4&
1、java数据库操作基本流程 4c,{Js
2、几个常用的重要技巧: NOQSL T=
可滚动、更新的记录集 2PViY,V|
批量更新 yP "D~u
事务处理 ./_4D}
;~"#aL50fe
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Gj- *D7X5
1、取得数据库连接 a=r^?q'/
1)用DriverManager取数据库连接 ]]6
例子 \~#$o34V
String className,url,uid,pwd; t-Zk)*d/0
className = "oracle.jdbc.driver.OracleDriver"; &eFv~9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *n*po.Xr
uid = "system"; {SwvUWOf"
pwd = "manager"; CuAA)B j
Class.forName(className); V\/5H~L
Connection cn = DriverManager.getConnection(url,uid,pwd); yIf>8ed]#
2)用jndi(java的命名和目录服务)方式 Ey]P
>J
例子 "%dok@v
String jndi = "jdbc/db"; 9$ =o({
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -!-1X7v|Fp
DataSource ds = (DataSource) ctx.lookup(jndi); 8C4v
Connection cn = ds.getConnection(); m%.7l8vT
多用于jsp中 UEH+E&BCC
2、执行sql语句 ^~DClZ
1)用Statement来执行sql语句 0#!Z1:Y
String sql; QN8.FiiD
Statement sm = cn.createStatement(); ~+anI
sm.executeQuery(sql); // 执行数据查询语句(select) Ixr#zt$T-G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); icXeB_&cS
2)用PreparedStatement来执行sql语句 gVN&?`k*?
String sql; =`f"8,5
sql = "insert into user (id,name) values (?,?)"; qVr?st
PreparedStatement ps = cn.prepareStatement(sql); KFf6um
ps.setInt(1,xxx); 3.V-r59
ps.setString(2,xxx); QvDD
... Y/`*t(/5
ResultSet rs = ps.executeQuery(); // 查询 B'-L-]\H
int c = ps.executeUpdate(); // 更新 b\^9::oY
2@?\"kR"!
3、处理执行结果 U,tWLX$@
查询语句,返回记录集ResultSet cE7IHQ
更新语句,返回数字,表示该更新影响的记录数 o0FVVS l
ResultSet的方法 u;H5p\zAzz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6#(rWW"_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,H:{twc
9Fh1rZD<
4、释放连接 |YK4V(5x
cn.close(); !--A"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r=:o$e
"dFuQB
可滚动、更新的记录集 ]7
2wv#-
1、创建可滚动、更新的Statement hC2_Yr>N%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); RrRE$g
该Statement取得的ResultSet就是可滚动的 )" H r3
2、创建PreparedStatement时指定参数 }NF7"tOL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); UO8./%'
ResultSet.absolute(9000); [|dQZ
批量更新 .Eg[[K_iD
1、Statement "V:E BR
Statement sm = cn.createStatement(); O_[]+5.TX
sm.addBatch(sql1); $v~I n
sm.addBatch(sql2); PP!}w
... r|JZU
sm.executeBatch() RtScv
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 BV512+M
2、PreparedStatement b(?A^a
PreparedStatement ps = cn.preparedStatement(sql); +I_p\/J?w/
{ S#f}mb0,
ps.setXXX(1,xxx); 8L,i}hIo.
... &J}w_BFww
ps.addBatch(); &&sCaNb
} XZ1WY(
ps.executeBatch(); JB(P-Y#yyA
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 WG(%Pkowv
u{(-`Al}L
事务的处理 "bk'#?9
1、关闭Connection的自动提交 (VH0+
cn.setAutoCommit(false); v@;!fBUt
2、执行一系列sql语句 (g#,AX
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $S{]` +
Statement sm ; sA[eKQjaD
sm = cn.createStatement(insert into user...); N83g=[
sm.executeUpdate(); JN<IMH
sm.close(); "M4gl
sm = cn.createStatement("insert into corp...); Ilv
_.
sm.executeUpdate(); _5SA(0D#9
sm.close(); "%fvA;
3、提交 D$PR<>=y
cn.commit(); 8VLD yX2-
4、如果发生异常,那么回滚 .80L>0
cn.rollback();