java 数据库基本操作 6M#}&Gv
1、java数据库操作基本流程 C JYpgSr
2、几个常用的重要技巧: 8C=8Wjm
可滚动、更新的记录集 gq7l>vT.
批量更新 ;u?L>(b
事务处理 A4tb>OM
oazY?E]}3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'QdDXw5o
1、取得数据库连接 ^Q#g-"b
1)用DriverManager取数据库连接 B9:
i.rQ
例子 0woLB#v9
String className,url,uid,pwd; uj~(r=%
className = "oracle.jdbc.driver.OracleDriver"; =c;.cW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3P *[!KI
uid = "system"; Krd0Gc~\|
pwd = "manager"; ="('
#o
Class.forName(className); @@z5v bs'{
Connection cn = DriverManager.getConnection(url,uid,pwd); >c@jl
2)用jndi(java的命名和目录服务)方式 Tr.u'b(
例子 mhgvN-? "h
String jndi = "jdbc/db"; M,vCAZ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ZK4d;oa",
DataSource ds = (DataSource) ctx.lookup(jndi); 7PbwCRg
Connection cn = ds.getConnection(); TtWWq5X|
多用于jsp中 $/kZKoF{f
2、执行sql语句 fyF8RTm{
1)用Statement来执行sql语句 xyrlR;Sk
String sql; =/+f3
Statement sm = cn.createStatement(); Ly-}HW (
sm.executeQuery(sql); // 执行数据查询语句(select) j"
5 +"j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a_\t(U
2)用PreparedStatement来执行sql语句 S=a>rnF
String sql; 6Qn};tbnD
sql = "insert into user (id,name) values (?,?)"; 'j\~> a3\
PreparedStatement ps = cn.prepareStatement(sql); blKF78
ps.setInt(1,xxx); ]64pb;w"$D
ps.setString(2,xxx); =eQ'^3a
... ROJ=ZYof
ResultSet rs = ps.executeQuery(); // 查询 cKB1o0JsYJ
int c = ps.executeUpdate(); // 更新 @Yw>s9X
WCP2x.gb5
3、处理执行结果 HP,{/ $i:
查询语句,返回记录集ResultSet g!;a5p6
更新语句,返回数字,表示该更新影响的记录数 zwJ\F '
ResultSet的方法 /[I#3|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E/hO0Ox6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4vi[hiV
gLwrYG7@
4、释放连接 &3|l4R\
cn.close(); ,0@QBr5P
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection v(]dIH
b/d1(B@
可滚动、更新的记录集 {n{-5Y
1、创建可滚动、更新的Statement Z=beki]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =J`M}BBx
该Statement取得的ResultSet就是可滚动的 `h~-
2、创建PreparedStatement时指定参数 bR<XQHl
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1Q7]1fRu
ResultSet.absolute(9000); 0*,]`A=
批量更新 $"g'C8
1、Statement m[nrr6 G"
Statement sm = cn.createStatement(); o|APsQE
sm.addBatch(sql1); ;)Sf|
sm.addBatch(sql2); |`' WEe2
... K(AZD&D
sm.executeBatch() Z3f}'vr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 dN@C)5pm5`
2、PreparedStatement riQ0'-p
PreparedStatement ps = cn.preparedStatement(sql); {$I1(DYN
{ L=gG23U&
ps.setXXX(1,xxx); qS?^(Vt|R
... !
u9LZ
ps.addBatch(); h\4enu9[RL
} 8M,$|\U
ps.executeBatch(); C,B{7s0-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _FkH;MG WS
C6qGCzlG`
事务的处理 }J6 y NoXu
1、关闭Connection的自动提交
825 QS`
cn.setAutoCommit(false); gkDXt^Ob
2、执行一系列sql语句 rQ(u@u;
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close oK3PA
Statement sm ; WO*dO9O
sm = cn.createStatement(insert into user...); PY#_$ C
sm.executeUpdate(); >]x%+@{|
sm.close(); s8;*Wt
sm = cn.createStatement("insert into corp...); :464~tHI[`
sm.executeUpdate(); "(iQ-g Mm
sm.close(); l)f 2T@bHl
3、提交 fs2y$HN
cn.commit(); cvC 7#i[G
4、如果发生异常,那么回滚 <CWOx&hr
cn.rollback();