java 数据库基本操作 "ct58Y@
1、java数据库操作基本流程 t?HF-zQ
2、几个常用的重要技巧: 6(>WGR
可滚动、更新的记录集 5~Q Tg
批量更新 1 )'Iu`k/
事务处理 [EER4@_
7/
t:YBR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {<!hlB
1、取得数据库连接 %P;[fJ
`G
1)用DriverManager取数据库连接 QAi1,+y]7w
例子 u3ST;
String className,url,uid,pwd; L@?e:*h
className = "oracle.jdbc.driver.OracleDriver"; 12 -EDg/1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; }Bi@?Sb
uid = "system"; >C*4_J7
pwd = "manager"; ~@@
Z|w
Class.forName(className); W6i3Psjsw
Connection cn = DriverManager.getConnection(url,uid,pwd); 2
ZK%)vq0
2)用jndi(java的命名和目录服务)方式 m2Q$+p@
例子 i\ "{#
String jndi = "jdbc/db"; EWO /u.z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @%:E }
DataSource ds = (DataSource) ctx.lookup(jndi); h"r!q[MNo
Connection cn = ds.getConnection(); L0xsazX:x
多用于jsp中 ~3d*b8
2、执行sql语句 g8'~e{=(
1)用Statement来执行sql语句 [1U{ci&=p
String sql; "O``7HA}
Statement sm = cn.createStatement(); y]
y9'5_
sm.executeQuery(sql); // 执行数据查询语句(select) Hr&Ere8.4p
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); E?_ zZ2
2)用PreparedStatement来执行sql语句 ~5T$8^K
String sql; ']h
IfOD"r
sql = "insert into user (id,name) values (?,?)"; sjn:O'
PreparedStatement ps = cn.prepareStatement(sql); ?aFZOc4
ps.setInt(1,xxx); 5aG5BA[N
ps.setString(2,xxx); u-:MVEm
... LZa%
x
ResultSet rs = ps.executeQuery(); // 查询 xj7vI&u.
int c = ps.executeUpdate(); // 更新 T0Q51Q
MO TE/JG
3、处理执行结果 fdLBhe#9M
查询语句,返回记录集ResultSet h;nQxmJ9
更新语句,返回数字,表示该更新影响的记录数 ^N{k6>;
ResultSet的方法 2LC
w*eT{)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #QS?s8IrW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C99&L3bz^(
-x5F;d}
4、释放连接 _JA:.V^3gm
cn.close(); !=y Q)l2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @h9K
d>/Tu_ y
可滚动、更新的记录集 TL'0T,Jo
1、创建可滚动、更新的Statement }/"4|U
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %/!+(7
D
该Statement取得的ResultSet就是可滚动的 <]'|$8&jY
2、创建PreparedStatement时指定参数 V)h
y0_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~
aA;<#
ResultSet.absolute(9000); t#~XLCE
批量更新 _*n)mlLln
1、Statement 7@3sUA_Go
Statement sm = cn.createStatement(); g>T
sm.addBatch(sql1); H?{MRe
sm.addBatch(sql2); Yt*vqm[WV
... 4DM*^=9E
sm.executeBatch() d- kZt@DL=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 OpUA{P
2、PreparedStatement Y;eoTJ
PreparedStatement ps = cn.preparedStatement(sql); Tyd
h9I
{ 6]ZO'Nwo
ps.setXXX(1,xxx); |6*Va%LYO-
... {=iyK/Uf
ps.addBatch(); ?BsH{QRYQ
} D2]ZMDL.
ps.executeBatch(); }I'^./za
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?0) @jc=
Q.E_:=*H
事务的处理 EBwK 7c
1、关闭Connection的自动提交 In+^V([u+_
cn.setAutoCommit(false); cm,4&x6
2、执行一系列sql语句 &mdB\Y?^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s~Gw
Statement sm ; URQ@=W7
sm = cn.createStatement(insert into user...); lRH0)5`
sm.executeUpdate(); Bq{]Eh0%
sm.close(); ,5.
<oDH
sm = cn.createStatement("insert into corp...); |*fNH(8&H
sm.executeUpdate(); ,Z5Fea
sm.close(); cd&B?\I
3、提交 Fs)
cn.commit(); qRl/Sl#F
4、如果发生异常,那么回滚 4m\([EO
cn.rollback();