java 数据库基本操作 eY'RDQa
1、java数据库操作基本流程 7_ 5-gtD
2、几个常用的重要技巧: Mdy4H[Odq
可滚动、更新的记录集 &MJ`rj[%
批量更新 J!5&Nc
事务处理 #} `pj}tQ
n6#z{,W<3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ak,T{;rD
1、取得数据库连接 wl%I(Cw{]
1)用DriverManager取数据库连接 1<pb=H
例子 +}^^]J$Nh
String className,url,uid,pwd;
lN[#+n
className = "oracle.jdbc.driver.OracleDriver"; +qM2&M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NrfAr}v'E
uid = "system"; gq&jNj7V
pwd = "manager"; }_9yemP
Class.forName(className); vH>s2\V"
Connection cn = DriverManager.getConnection(url,uid,pwd); '],G!U(
2)用jndi(java的命名和目录服务)方式 ;b0;66C8|
例子 )bK3%>H#
String jndi = "jdbc/db"; }ykc
AK3U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y?JB%%WWI
DataSource ds = (DataSource) ctx.lookup(jndi); ST[E$XL6
Connection cn = ds.getConnection(); ?2Sm
f
多用于jsp中 kntULI$`
2、执行sql语句 %[k"A
1)用Statement来执行sql语句 j.SE'a_
String sql; ~.J{yrJ&
Statement sm = cn.createStatement(); aoU5pftC
sm.executeQuery(sql); // 执行数据查询语句(select) $%?[f;S3,
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); WTu1t]
2)用PreparedStatement来执行sql语句 |
=tGrHL
String sql; j%fi*2uX
sql = "insert into user (id,name) values (?,?)"; }syU(];s
PreparedStatement ps = cn.prepareStatement(sql); 3ZX#6*(}2
ps.setInt(1,xxx); He LW*
ps.setString(2,xxx); Ap!i-E,"J
... !w:pb7+G
ResultSet rs = ps.executeQuery(); // 查询 E#c9n%E\sz
int c = ps.executeUpdate(); // 更新 D]+@pKb
rVDOco+w
3、处理执行结果 Poxoc-s
查询语句,返回记录集ResultSet F|?}r3{aJ
更新语句,返回数字,表示该更新影响的记录数 C$`^(?iO/
ResultSet的方法 P+Sgbtc
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w9CX5Fg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xgZ<.r
[lE^0_+
4、释放连接 :Oi}X7\
cn.close(); a*!9RQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection X-cP'"
`/o| 1vv@_
可滚动、更新的记录集 %H=^U8WB
1、创建可滚动、更新的Statement M8f[ ck
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); TZa LB}4
该Statement取得的ResultSet就是可滚动的 t7,** $ST
2、创建PreparedStatement时指定参数 k~=P0";
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _ IlRZ} f
ResultSet.absolute(9000); 9oj0X>| 1
批量更新 nSq$,tk(
1、Statement G(#EW+
Statement sm = cn.createStatement(); *I`Eb7
^
sm.addBatch(sql1); Fuo.8
sm.addBatch(sql2); OwLJS5r@<-
... @ [j%V ynf
sm.executeBatch() L.%zs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -;GB Xq
2、PreparedStatement 8n/[oDc]
PreparedStatement ps = cn.preparedStatement(sql); Nd**":i$
{ M#xol/)h
ps.setXXX(1,xxx); dXDuO
... iy|xF~
ps.addBatch(); =+"-8tz8FV
} `i6q\-12n
ps.executeBatch(); nC#SnyUO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {"\pMY'7
Fhs/<w-
事务的处理 _`xhP-,`S
1、关闭Connection的自动提交 __)"-\w-_(
cn.setAutoCommit(false);
S
vW{1
2、执行一系列sql语句 8FQNeQr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xhncQhf\
Statement sm ; Hh &s.ja
sm = cn.createStatement(insert into user...); L^L.;1
sm.executeUpdate(); +@anYtv%7
sm.close(); fILD~
sm = cn.createStatement("insert into corp...); +A2}@k
sm.executeUpdate(); /cx
Ei6I-
sm.close(); |O[ I=!
3、提交 $A>]lLo0
cn.commit(); K(_8oB784
4、如果发生异常,那么回滚 Hx ojxZwm
cn.rollback();