java 数据库基本操作 .N'%hh
1、java数据库操作基本流程 :Q0?ub]
2、几个常用的重要技巧: A?%XO
%
可滚动、更新的记录集 *rujdQf
批量更新 I_R5\l}O+D
事务处理 A=\'r<:
p0%6@_FT~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;@h'Mb
1、取得数据库连接 fJ|Bu("N
1)用DriverManager取数据库连接 MZ >0K
例子 R(n0!h4
String className,url,uid,pwd; UvW:#
className = "oracle.jdbc.driver.OracleDriver"; #]N&6ngJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
h;:Se
uid = "system"; Q}k_#w
pwd = "manager"; =l?"=HF
Class.forName(className); .$}Z:,aB
Connection cn = DriverManager.getConnection(url,uid,pwd); ys~p(
2)用jndi(java的命名和目录服务)方式 .lNnY8<
例子 GT1 X
String jndi = "jdbc/db"; PEwW*4Xo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); pE YrmC
DataSource ds = (DataSource) ctx.lookup(jndi); 80R=r
Connection cn = ds.getConnection(); <W^XSk
多用于jsp中 Npg5Z%+y
2、执行sql语句 M25z<Y
1)用Statement来执行sql语句 3qV>TE]6,
String sql; Xbsj:Ko]]U
Statement sm = cn.createStatement(); h\: tUEg#J
sm.executeQuery(sql); // 执行数据查询语句(select) rwV u?W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^0,&R\e+
2)用PreparedStatement来执行sql语句 2kmna/Qa6
String sql; =O}%bZ)Q
sql = "insert into user (id,name) values (?,?)"; 5e~{7{
PreparedStatement ps = cn.prepareStatement(sql); b$$L]$q2
ps.setInt(1,xxx); )MX1776kU
ps.setString(2,xxx); %lqG* dRx0
... )eedfb1
ResultSet rs = ps.executeQuery(); // 查询 CH R?i1e
int c = ps.executeUpdate(); // 更新 6u]OXPA|
kdueQ(\
3、处理执行结果 `- uZv
查询语句,返回记录集ResultSet d9e H}#OY
更新语句,返回数字,表示该更新影响的记录数 nH3b<k;S
ResultSet的方法 ;H#R{uR_<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .AQ3zpy5B
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `'k's]Y
HU.6L'H*
4、释放连接
p=P0$P+KM
cn.close();
"lnk
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `a1R "A
kHIQ/\3?Q
可滚动、更新的记录集 !E.lyz
1、创建可滚动、更新的Statement Qre&N_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C?<XtIoB
该Statement取得的ResultSet就是可滚动的 gt~2Br4
2、创建PreparedStatement时指定参数 <?va)
ou
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =rtA{g$)+
ResultSet.absolute(9000); Q8/0Cb/
批量更新 -H]f@|AOw
1、Statement j!8+|eAkk
Statement sm = cn.createStatement(); u2x=YUWb]
sm.addBatch(sql1); g1!L.
On
sm.addBatch(sql2); YV!V9
... o%JIJ7M
sm.executeBatch() rls#gw
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 e ~,'|~
C5
2、PreparedStatement ob5nk^y
PreparedStatement ps = cn.preparedStatement(sql); xr-`i
{ u4^"E+y^S
ps.setXXX(1,xxx); 4 AmF^H
... ^{+:w:g
ps.addBatch(); G(3la3\(
} h}<ZZ
ps.executeBatch(); KIl.?_61O
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 scEQDV
->9xw
事务的处理 `-YSFQ~O,
1、关闭Connection的自动提交 [cAg'R6
cn.setAutoCommit(false); uiEA=*axp
2、执行一系列sql语句 ;+KgujfU
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S&)
>w5*]U
Statement sm ; /%w[q:..h
sm = cn.createStatement(insert into user...); Yf`.Cq_:
sm.executeUpdate(); y,
_3Ks
sm.close(); ~*]`XL.-
sm = cn.createStatement("insert into corp...); a-2
{x2O
sm.executeUpdate(); .TS=[WGMS
sm.close(); GQBN-Qv
3、提交 Y rnqi-P
cn.commit(); 5kNs@FP
4、如果发生异常,那么回滚 ;7*@Gf}R
cn.rollback();