java 数据库基本操作 ScYw3i
1、java数据库操作基本流程 "?hEGJ;m"
2、几个常用的重要技巧: F`3c uL[N
可滚动、更新的记录集 dX: (%_Mn
批量更新 at${^,&
事务处理 f@Rn&&-
:f?\ mVS+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 mdR:XuRD"t
1、取得数据库连接 .@ZqCH
1)用DriverManager取数据库连接 ~xpU<Pd*
例子 hV])\t=yf
String className,url,uid,pwd; =O1N*'e
className = "oracle.jdbc.driver.OracleDriver"; ngj=w;7~+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; k!b\qS~Q
uid = "system"; Mb=vIk{Bf
pwd = "manager"; !
R?r)G5E
Class.forName(className); snOd
3Bw
Connection cn = DriverManager.getConnection(url,uid,pwd); mnu4XE#|
2)用jndi(java的命名和目录服务)方式 So\(]S
例子 9%j_"+<c
String jndi = "jdbc/db"; N&U=5c`Q'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i)g=Lew
DataSource ds = (DataSource) ctx.lookup(jndi); 2@@OjeANsX
Connection cn = ds.getConnection(); LX'.up11X5
多用于jsp中 \B8tGog
2、执行sql语句 z;@;jQ7
1)用Statement来执行sql语句 pI|Lt
String sql; ilEWxr;,
Statement sm = cn.createStatement(); 3:7J@>
sm.executeQuery(sql); // 执行数据查询语句(select) qP6]}Aj]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :TqvL'9o
2)用PreparedStatement来执行sql语句 j{SRE1tqh
String sql; t/LQ|/xo
sql = "insert into user (id,name) values (?,?)"; fGHYs
PreparedStatement ps = cn.prepareStatement(sql); EFu2&P
ps.setInt(1,xxx); &WE| 9
ps.setString(2,xxx); j1%o+#df
... d76k1-m\o
ResultSet rs = ps.executeQuery(); // 查询 l9"0Wu@_x
int c = ps.executeUpdate(); // 更新 CTQF+Oe8O
[URo#
3、处理执行结果 fi^I1*S
查询语句,返回记录集ResultSet l7]:b8
更新语句,返回数字,表示该更新影响的记录数 I3]-$
ResultSet的方法 ?*|AcMw5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^EWkJW,Yc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :#1{c^i%3
0m7ANqE[Z
4、释放连接 9{@[l!]W
cn.close(); m.e+S,i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection O-y/K2MC*
qZACX.Hw
可滚动、更新的记录集 Mh"DPt9@J
1、创建可滚动、更新的Statement %yX?4T;b
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'd 4I/
该Statement取得的ResultSet就是可滚动的 losm<
2、创建PreparedStatement时指定参数 [ Hw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rXc-V},az8
ResultSet.absolute(9000); QE*O~Yj
批量更新 16ahU$@-
1、Statement
?TA%P6Lw
Statement sm = cn.createStatement(); ;=
^kTb`X
sm.addBatch(sql1); a|rN %hA4
sm.addBatch(sql2); ~=91Kxf
... A&X(\ c M
sm.executeBatch() EjW3_ %
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~sT/t1Rp
2、PreparedStatement )zz^RB\p
PreparedStatement ps = cn.preparedStatement(sql); 0YK`wuZGS
{ nXPl\|pXt
ps.setXXX(1,xxx); IV*@}~BJ
... nf=*KS\v
ps.addBatch(); 9o5W\.A7[D
} %Z9&z mO
ps.executeBatch(); I.BsKB
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 I[,tf!
dCv@l7hE
事务的处理 cO/%;HEV
1、关闭Connection的自动提交 e^2e[rp0
cn.setAutoCommit(false); 5SPhdpIg@[
2、执行一系列sql语句 =<Q_&_.60
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7Mq4$|qhD
Statement sm ; A2>rS
sm = cn.createStatement(insert into user...); zmd,uhNc:
sm.executeUpdate(); 4.il4Qqy}i
sm.close(); X^;[X~g
sm = cn.createStatement("insert into corp...); ]5| o8.
sm.executeUpdate(); yN}upYxp
sm.close(); FN jT?*
3、提交 l3kYfq{";"
cn.commit(); +TzZ
4、如果发生异常,那么回滚 +@*}_%^l"
cn.rollback();