java 数据库基本操作 ihJC)m`Hbl
1、java数据库操作基本流程 #dgWXO
2、几个常用的重要技巧: kDG'5X;+
可滚动、更新的记录集 k99ANW
批量更新 yxa~Rz/
事务处理 8HLcDS#
sR. ecs+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ilc FW
1、取得数据库连接 z!I(B^)BkT
1)用DriverManager取数据库连接 x@]pUA1
例子 JDzkv%E^
String className,url,uid,pwd; Q`}n;DV
className = "oracle.jdbc.driver.OracleDriver"; E*Q><UU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; RZ[r XV5
uid = "system"; 1!E+(Iq
pwd = "manager"; a,U =irBA
Class.forName(className); ]{[VTjC7rY
Connection cn = DriverManager.getConnection(url,uid,pwd); !Ax 7k;T
2)用jndi(java的命名和目录服务)方式 WM}bM]oe
例子 {-]/r
String jndi = "jdbc/db"; \8!&XcA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4{\h53j$
DataSource ds = (DataSource) ctx.lookup(jndi); Tdr^~dcQ
Connection cn = ds.getConnection(); $W8
多用于jsp中 #mX=Y>l
2、执行sql语句 uj-q@IKe
1)用Statement来执行sql语句 n8M/Y}mH
String sql;
U!-|.N,
Statement sm = cn.createStatement(); ?6
"F.\O@
sm.executeQuery(sql); // 执行数据查询语句(select) N+?kFob
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); iD|"} }01
2)用PreparedStatement来执行sql语句 e.0vh?{\
String sql; S`"M;%T
sql = "insert into user (id,name) values (?,?)"; <&o
`T4
PreparedStatement ps = cn.prepareStatement(sql); XRI1/2YA
ps.setInt(1,xxx); }q( IKH\&
ps.setString(2,xxx); |400N
+MK
... +6!.)Ea=
ResultSet rs = ps.executeQuery(); // 查询 -NVk>ENL4
int c = ps.executeUpdate(); // 更新 5|-(Ic
Kk~0jP_ B9
3、处理执行结果 56o?=|
查询语句,返回记录集ResultSet 4.3Bz1p
更新语句,返回数字,表示该更新影响的记录数 nFlj`k<]Y
ResultSet的方法 I@ch 5vl4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >:s.`jV<
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 fwI Zr~l
M)#R_(Q5{
4、释放连接 KW.S)+<H&
cn.close(); 1GW=QbO 6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3yXF|
yV
'MM#nQ\(
可滚动、更新的记录集 d
`Q$URn|
1、创建可滚动、更新的Statement `ge{KB;*n#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -{ZTp8P>
该Statement取得的ResultSet就是可滚动的 Z\{WBUR;4t
2、创建PreparedStatement时指定参数 eR8qO"%2:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QH4nb h4
ResultSet.absolute(9000); "_C^Bc
批量更新 y-"*[5{W
1、Statement U$pHfNTH
Statement sm = cn.createStatement(); ?/{
qRz'C<
sm.addBatch(sql1); +6f5uMKUvs
sm.addBatch(sql2); ;=Bf&hY&
... D;<Qm,[
sm.executeBatch() @-;-DB]j
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "31GC7
2、PreparedStatement Gn;eh~uw;l
PreparedStatement ps = cn.preparedStatement(sql); /v;g v[
{ wLU w'Ai
ps.setXXX(1,xxx); xN}P0
... &^4W+I{H
ps.addBatch(); ,_Fq*6
} qB7.LR*'
ps.executeBatch(); $RKd@5XP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7s5?^^
G_[|N>
事务的处理 s iv
KXd
1、关闭Connection的自动提交 .Kq>/6
cn.setAutoCommit(false); :H\6wJ
2、执行一系列sql语句 _hMVv&$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close d+ih]?
Statement sm ; S53 [Ja
sm = cn.createStatement(insert into user...); uHQJ&
sm.executeUpdate(); f<WnPoV
sm.close(); E[htNin.B~
sm = cn.createStatement("insert into corp...); ?YgK]IxD
sm.executeUpdate(); _:M6~XHo
sm.close(); akBR"y:~:H
3、提交 c1CP12
cn.commit(); 3VA8K@QiRm
4、如果发生异常,那么回滚 "a`0s_F,^
cn.rollback();