java 数据库基本操作 zeq")A
1、java数据库操作基本流程 ,N;2"$+E
2、几个常用的重要技巧: X|&H2y|*7
可滚动、更新的记录集 YQyI{
批量更新 `,]_r4~ ~
事务处理 e"*1l>g
'nq~1 >i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f96`n+>xi
1、取得数据库连接 i8p$wf"aW
1)用DriverManager取数据库连接 m#R"~ >
例子 Qv
g_|~n
String className,url,uid,pwd; |ICn/r~
className = "oracle.jdbc.driver.OracleDriver"; >&ZlCE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `7'^y
uid = "system"; 2h#.:!/SMw
pwd = "manager"; T1R~^x1
Class.forName(className); IuA4eDr^Y%
Connection cn = DriverManager.getConnection(url,uid,pwd); OnhR`
2)用jndi(java的命名和目录服务)方式 ]*g f$D
例子 q/Vl>t
String jndi = "jdbc/db"; ^)GaVL^"5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); on"ENT
DataSource ds = (DataSource) ctx.lookup(jndi); C<(qk _
Connection cn = ds.getConnection(); zbr^ul r
多用于jsp中 <6s@eare8
2、执行sql语句 `'*4B_.
1)用Statement来执行sql语句 rA^=;?7Q
String sql;
?6>*mdpl
Statement sm = cn.createStatement(); 4q:8<*W=
sm.executeQuery(sql); // 执行数据查询语句(select) J}+N\V~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G9V2(P
2)用PreparedStatement来执行sql语句 ?3qp?ea
String sql; >56fa6=3@
sql = "insert into user (id,name) values (?,?)"; WW+F9~S
PreparedStatement ps = cn.prepareStatement(sql); XR3 dG:
ps.setInt(1,xxx); >I<}:=
ps.setString(2,xxx); I3b*sx$
... uMpuS1
ResultSet rs = ps.executeQuery(); // 查询 +IWf~|s
int c = ps.executeUpdate(); // 更新 K:kb&W
p_%,JD
3、处理执行结果 SAj#+_db
查询语句,返回记录集ResultSet cNFHbMd
更新语句,返回数字,表示该更新影响的记录数 jKo9y
ResultSet的方法 ; yE.R[I
1、next(),将游标往后移动一行,如果成功返回true;否则返回false WPrBK{B`o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 E:k]Z
)MLbE-@
4、释放连接 FCOa|IKsN
cn.close(); z@o6[g/*Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (C1~>7L
CE!cZZ
可滚动、更新的记录集 >,tJq%
1、创建可滚动、更新的Statement bfEH>pQ>#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $7]?P;$
该Statement取得的ResultSet就是可滚动的 U;*t5l
2、创建PreparedStatement时指定参数 sDR Av%w
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YJ-<t6
ResultSet.absolute(9000); + !"YC
批量更新 .C5<uW5-R
1、Statement n~BQq-1
Statement sm = cn.createStatement(); SIKaDIZ
sm.addBatch(sql1); Hz[1c4)'F
sm.addBatch(sql2); Yk)fBPHr
... 8DMqjt3B
sm.executeBatch() $G 6kS@A
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 D!#B*[|
2、PreparedStatement &<_q00F
PreparedStatement ps = cn.preparedStatement(sql); :Ny[?jtc
{ LFqY2,#i
ps.setXXX(1,xxx); K"|~D0Qgo
... #_`p
0wY
ps.addBatch(); ^$C&{%
} :VWN/m
ps.executeBatch(); |(TEG.<g
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Y2'HP)tfIw
rBU)@I pDG
事务的处理 .qKfhHJ
1、关闭Connection的自动提交 o8H\l\(
cn.setAutoCommit(false); 98| v.d
2、执行一系列sql语句 FGie*t
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >R_m@$`
Statement sm ; \ykA7Y%
sm = cn.createStatement(insert into user...); {T,}]oX
sm.executeUpdate(); US^%pd
sm.close(); $T:;KcW)
sm = cn.createStatement("insert into corp...); <P ?gP1_zi
sm.executeUpdate(); kOdpW
sm.close(); f Ayh9
3、提交 r..f$FF)\
cn.commit(); D5({&.X[-
4、如果发生异常,那么回滚 8z7eL>)
cn.rollback();